電子商務(wù)使用數(shù)據(jù)加密來保護(hù)數(shù)據(jù)庫
摘?要:本文首先分析了數(shù)據(jù)庫數(shù)據(jù)需要加密的原因,簡(jiǎn)要介紹了DES算法及Java密碼體系和Java密碼擴(kuò)展,最后說明了利用DES加密算法保護(hù)數(shù)據(jù)庫數(shù)據(jù)的方法及步驟。
關(guān)鍵詞?電子商務(wù)?Java?加密?DES算法
Java語言是一種非常適用于網(wǎng)絡(luò)編程的語言,它的基本結(jié)構(gòu)與C++極為相似,但拋棄了C/C++中指針等內(nèi)容,同時(shí)它吸收了Smalltalk、C++面向?qū)ο蟮木幊趟枷搿K哂泻?jiǎn)單性、魯棒性、可移植性、動(dòng)態(tài)性等特點(diǎn)。這些特點(diǎn)使得Java成為跨平臺(tái)應(yīng)用開發(fā)的一種規(guī)范,在世界范圍內(nèi)廣泛流傳。
數(shù)據(jù)庫數(shù)據(jù)需要加密的原因
????電子商務(wù)網(wǎng)站中,數(shù)據(jù)庫的信息至關(guān)重要,尤其現(xiàn)在貨物的實(shí)時(shí)交易,使得一些比較重要的信息不得不存儲(chǔ)在數(shù)據(jù)庫或者其它容易泄露或者不安全的地方(當(dāng)然,也沒有絕對(duì)安全的),例如數(shù)字商品信息、銀行卡賬號(hào)等,一旦諸如黑客一般的網(wǎng)絡(luò)高手成功入侵到我們的系統(tǒng),如果我們的數(shù)據(jù)庫信息沒有加密,那么我們所有的東西便拱手相送了,這不僅危害了商戶的利益,更使得客戶遭受損失,進(jìn)一步也會(huì)影響中國(guó)電子商務(wù)的里程,所以數(shù)據(jù)庫中一些重要信息的加密起到的很重要的作用。
Java密碼體系和Java密碼擴(kuò)展
Java密碼體系(JCA)和Java密碼擴(kuò)展(JCE)的設(shè)計(jì)目的是為Java提供與實(shí)現(xiàn)無關(guān)的加密函數(shù)API。它們都用factory方法來創(chuàng)建類的例程,然后把實(shí)際的加密函數(shù)委托給提供者指定的底層引擎,引擎中為類提供了服務(wù)提供者接口在Java中實(shí)現(xiàn)數(shù)據(jù)的加密/解密,是使用其內(nèi)置的JCE(Java加密擴(kuò)展)來實(shí)現(xiàn)的。Java開發(fā)工具集1.1為實(shí)現(xiàn)包括數(shù)字簽名和信息摘要在內(nèi)的加密功能,推出了一種基于供應(yīng)商的新型靈活應(yīng)用編程接口。Java密碼體系結(jié)構(gòu)支持供應(yīng)商的互操作,同時(shí)支持硬件和軟件實(shí)現(xiàn)。
Java密碼學(xué)結(jié)構(gòu)設(shè)計(jì)遵循兩個(gè)原則:
(1)算法的獨(dú)立性和可靠性。
(2)實(shí)現(xiàn)的獨(dú)立性和相互作用性。
算法的獨(dú)立性是通過定義密碼服務(wù)類來獲得。用戶只需了解密碼算法的概念,而不用去關(guān)心如何實(shí)現(xiàn)這些概念。實(shí)現(xiàn)的獨(dú)立性和相互作用性通過密碼服務(wù)提供器來實(shí)現(xiàn)。密碼服務(wù)提供器是實(shí)現(xiàn)一個(gè)或多個(gè)密碼服務(wù)的一個(gè)或多個(gè)程序包。軟件開發(fā)商根據(jù)一定接口,將各種算法實(shí)現(xiàn)后,打包成一個(gè)提供器,用戶可以安裝不同的提供器。安裝和配置提供器,可將包含提供器的ZIP和JAR文件放在CLASSPATH下,再編輯Java安全屬性文件來設(shè)置定義一個(gè)提供器。Java運(yùn)行環(huán)境Sun版本時(shí),?提供一個(gè)缺省的提供器Sun。
下面介紹DES算法及如何利用DES算法加密和解密類文件的步驟。
DES算法簡(jiǎn)介
DES(Data?Encryption?Standard)是發(fā)明最早的最廣泛使用的分組對(duì)稱加密算法。DES算法的入口參數(shù)有三個(gè):Key、Data、Mode。其中Key為8個(gè)字節(jié)共64位,是DES算法的工作密鑰;Data也為8個(gè)字節(jié)64位,是要被加密或被解密的數(shù)據(jù);Mode為DES的工作方式,有兩種:加密或解密。
DES算法工作流程如下:若Mode為加密模式,則利用Key?對(duì)數(shù)據(jù)Data進(jìn)行加密,?生成Data的密碼形式(64位)作為DES的輸出結(jié)果;如Mode為解密模式,則利用Key對(duì)密碼形式的數(shù)據(jù)Data進(jìn)行解密,還原為Data的明碼形式(64位)作為DES的輸出結(jié)果。在寫入和讀取的時(shí)候,使用一致的Key,在寫入時(shí)Key對(duì)核心數(shù)據(jù)進(jìn)行DES加密,然后存儲(chǔ)在數(shù)據(jù)庫中,數(shù)據(jù)要從數(shù)據(jù)庫取出時(shí),用同樣的Key對(duì)密碼數(shù)據(jù)進(jìn)行解密,便再現(xiàn)了明碼形式的核心數(shù)據(jù)。這樣,便保證了核心數(shù)據(jù)在數(shù)據(jù)庫存儲(chǔ)的安全性和可靠性。
????利用DES算法加密的步驟
(1)生成一個(gè)安全密鑰。在加密或解密任何數(shù)據(jù)之前需要有一個(gè)密鑰。密鑰是隨同被加密的應(yīng)用程序一起發(fā)布的一段數(shù)據(jù),密鑰代碼如下所示。
【生成一個(gè)密鑰代碼】
????//?生成一個(gè)可信任的隨機(jī)數(shù)源
????SecureRandom?sr?=?new?SecureRandom();
????//?為我們選擇的DES算法生成一個(gè)KeyGenerator對(duì)象
????KeyGenerator?kg?=?KeyGenerator.getInstance?("DES"?);
????Kg.init?(sr);
????//?生成密鑰
????Secret?Key?key?=?kg.generateKey();
????//?將密鑰數(shù)據(jù)保存為文件供以后使用,其中key?Filename為保存的文件名
????FileUtil.writeFile?(keyFilename,?key.getEncoded?()?);?
(2)加密數(shù)據(jù)。得到密鑰之后,接下來就可以用它加密數(shù)據(jù)。如下所示。
【用密鑰加密原始數(shù)據(jù)】
????//?產(chǎn)生一個(gè)可信任的隨機(jī)數(shù)源
????SecureRandom?sr?=?new?SecureRandom();
????//從密鑰文件key?Filename中得到密鑰數(shù)據(jù)
????Byte?rawKeyData?[]?=?FileUtil.readFile?(key?Filename);
????//?從原始密鑰數(shù)據(jù)創(chuàng)建DESKeySpec對(duì)象
????DESKeySpec?dks?=?new?DESKeySpec?(rawKeyData);
????//?創(chuàng)建一個(gè)密鑰工廠,然后用它把DESKeySpec轉(zhuǎn)換成Secret?Key對(duì)象
????SecretKeyFactory?key?Factory?=?SecretKeyFactory.getInstance("DES"?);
????Secret?Key?key?=?keyFactory.generateSecret(?dks?);
????//?Cipher對(duì)象實(shí)際完成加密操作
????Cipher?cipher?=?Cipher.getInstance(?"DES"?);
????//?用密鑰初始化Cipher對(duì)象
????cipher.init(?Cipher.ENCRYPT_MODE,?key,?sr?);
????//?獲取需要加密的數(shù)據(jù)str
????Byte?data?[]?=?str.getBytes();
????//?執(zhí)行加密操作
????Byte?encryptedClassData?[]?=?cipher.doFinal(data?);
????//?保存到數(shù)據(jù)庫中
(3)解密數(shù)據(jù)。操作步驟如下所示。?
【用密鑰解密數(shù)據(jù)】
????//?生成一個(gè)可信任的隨機(jī)數(shù)源
????SecureRandom?sr?=?new?SecureRandom();
????//?從密鑰文件中獲取原始密鑰數(shù)據(jù)
????Byte?rawKeyData[]?=?Util.readFile(?keyFilename?);
????//?創(chuàng)建一個(gè)DESKeySpec對(duì)象
????DESKeySpec?dks?=?new?DESKeySpec?(rawKeyData);
????//?創(chuàng)建一個(gè)密鑰工廠,然后用它把DESKeySpec對(duì)象轉(zhuǎn)換成Secret?Key對(duì)象?
????SecretKeyFactory?key?Factory?=?SecretKeyFactory.getInstance(?"DES"?);
????SecretKey?key?=?keyFactory.generateSecret(?dks?);
????//?Cipher對(duì)象實(shí)際完成解密操作
????Cipher?cipher?=?Cipher.getInstance(?"DES"?);
????//?用密鑰初始化Cipher對(duì)象
????Cipher.init(?Cipher.DECRYPT_MODE,?key,?sr?);
????//?從數(shù)據(jù)庫中獲得經(jīng)過加密的數(shù)據(jù)str
????Byte?encrypted?Data?[]?=?str.getBytes();
????//執(zhí)行解密操作
????Byte?decryptedData?[]?=?cipher.doFinal(?encryptedData?);
????//?然后將解密后的數(shù)據(jù)顯示給客戶。?
????我們需要開始在新系統(tǒng)里使用數(shù)據(jù)加密,如果不是在目前的系統(tǒng)里使用的話。我認(rèn)為這是項(xiàng)很大的工程,這也就是為什么我說在新系統(tǒng)里使用數(shù)據(jù)加密,而不是在舊系統(tǒng)里加上數(shù)據(jù)加密功能。最好方法就是從那些你最常使用的數(shù)據(jù)庫的提供廠商那里開始:Oracle、IBM和微軟。然后看看大量的第三方供應(yīng)商和其他互聯(lián)網(wǎng)安全專家能夠提供什么。無論你從哪里開始,最好都是今天開始,以免讓自己成為明天報(bào)紙的頭條新聞。
關(guān)鍵詞?電子商務(wù)?Java?加密?DES算法
Java語言是一種非常適用于網(wǎng)絡(luò)編程的語言,它的基本結(jié)構(gòu)與C++極為相似,但拋棄了C/C++中指針等內(nèi)容,同時(shí)它吸收了Smalltalk、C++面向?qū)ο蟮木幊趟枷搿K哂泻?jiǎn)單性、魯棒性、可移植性、動(dòng)態(tài)性等特點(diǎn)。這些特點(diǎn)使得Java成為跨平臺(tái)應(yīng)用開發(fā)的一種規(guī)范,在世界范圍內(nèi)廣泛流傳。
數(shù)據(jù)庫數(shù)據(jù)需要加密的原因
????電子商務(wù)網(wǎng)站中,數(shù)據(jù)庫的信息至關(guān)重要,尤其現(xiàn)在貨物的實(shí)時(shí)交易,使得一些比較重要的信息不得不存儲(chǔ)在數(shù)據(jù)庫或者其它容易泄露或者不安全的地方(當(dāng)然,也沒有絕對(duì)安全的),例如數(shù)字商品信息、銀行卡賬號(hào)等,一旦諸如黑客一般的網(wǎng)絡(luò)高手成功入侵到我們的系統(tǒng),如果我們的數(shù)據(jù)庫信息沒有加密,那么我們所有的東西便拱手相送了,這不僅危害了商戶的利益,更使得客戶遭受損失,進(jìn)一步也會(huì)影響中國(guó)電子商務(wù)的里程,所以數(shù)據(jù)庫中一些重要信息的加密起到的很重要的作用。
Java密碼體系和Java密碼擴(kuò)展
Java密碼體系(JCA)和Java密碼擴(kuò)展(JCE)的設(shè)計(jì)目的是為Java提供與實(shí)現(xiàn)無關(guān)的加密函數(shù)API。它們都用factory方法來創(chuàng)建類的例程,然后把實(shí)際的加密函數(shù)委托給提供者指定的底層引擎,引擎中為類提供了服務(wù)提供者接口在Java中實(shí)現(xiàn)數(shù)據(jù)的加密/解密,是使用其內(nèi)置的JCE(Java加密擴(kuò)展)來實(shí)現(xiàn)的。Java開發(fā)工具集1.1為實(shí)現(xiàn)包括數(shù)字簽名和信息摘要在內(nèi)的加密功能,推出了一種基于供應(yīng)商的新型靈活應(yīng)用編程接口。Java密碼體系結(jié)構(gòu)支持供應(yīng)商的互操作,同時(shí)支持硬件和軟件實(shí)現(xiàn)。
Java密碼學(xué)結(jié)構(gòu)設(shè)計(jì)遵循兩個(gè)原則:
(1)算法的獨(dú)立性和可靠性。
(2)實(shí)現(xiàn)的獨(dú)立性和相互作用性。
算法的獨(dú)立性是通過定義密碼服務(wù)類來獲得。用戶只需了解密碼算法的概念,而不用去關(guān)心如何實(shí)現(xiàn)這些概念。實(shí)現(xiàn)的獨(dú)立性和相互作用性通過密碼服務(wù)提供器來實(shí)現(xiàn)。密碼服務(wù)提供器是實(shí)現(xiàn)一個(gè)或多個(gè)密碼服務(wù)的一個(gè)或多個(gè)程序包。軟件開發(fā)商根據(jù)一定接口,將各種算法實(shí)現(xiàn)后,打包成一個(gè)提供器,用戶可以安裝不同的提供器。安裝和配置提供器,可將包含提供器的ZIP和JAR文件放在CLASSPATH下,再編輯Java安全屬性文件來設(shè)置定義一個(gè)提供器。Java運(yùn)行環(huán)境Sun版本時(shí),?提供一個(gè)缺省的提供器Sun。
下面介紹DES算法及如何利用DES算法加密和解密類文件的步驟。
DES算法簡(jiǎn)介
DES(Data?Encryption?Standard)是發(fā)明最早的最廣泛使用的分組對(duì)稱加密算法。DES算法的入口參數(shù)有三個(gè):Key、Data、Mode。其中Key為8個(gè)字節(jié)共64位,是DES算法的工作密鑰;Data也為8個(gè)字節(jié)64位,是要被加密或被解密的數(shù)據(jù);Mode為DES的工作方式,有兩種:加密或解密。
DES算法工作流程如下:若Mode為加密模式,則利用Key?對(duì)數(shù)據(jù)Data進(jìn)行加密,?生成Data的密碼形式(64位)作為DES的輸出結(jié)果;如Mode為解密模式,則利用Key對(duì)密碼形式的數(shù)據(jù)Data進(jìn)行解密,還原為Data的明碼形式(64位)作為DES的輸出結(jié)果。在寫入和讀取的時(shí)候,使用一致的Key,在寫入時(shí)Key對(duì)核心數(shù)據(jù)進(jìn)行DES加密,然后存儲(chǔ)在數(shù)據(jù)庫中,數(shù)據(jù)要從數(shù)據(jù)庫取出時(shí),用同樣的Key對(duì)密碼數(shù)據(jù)進(jìn)行解密,便再現(xiàn)了明碼形式的核心數(shù)據(jù)。這樣,便保證了核心數(shù)據(jù)在數(shù)據(jù)庫存儲(chǔ)的安全性和可靠性。
????利用DES算法加密的步驟
(1)生成一個(gè)安全密鑰。在加密或解密任何數(shù)據(jù)之前需要有一個(gè)密鑰。密鑰是隨同被加密的應(yīng)用程序一起發(fā)布的一段數(shù)據(jù),密鑰代碼如下所示。
【生成一個(gè)密鑰代碼】
????//?生成一個(gè)可信任的隨機(jī)數(shù)源
????SecureRandom?sr?=?new?SecureRandom();
????//?為我們選擇的DES算法生成一個(gè)KeyGenerator對(duì)象
????KeyGenerator?kg?=?KeyGenerator.getInstance?("DES"?);
????Kg.init?(sr);
????//?生成密鑰
????Secret?Key?key?=?kg.generateKey();
????//?將密鑰數(shù)據(jù)保存為文件供以后使用,其中key?Filename為保存的文件名
????FileUtil.writeFile?(keyFilename,?key.getEncoded?()?);?
(2)加密數(shù)據(jù)。得到密鑰之后,接下來就可以用它加密數(shù)據(jù)。如下所示。
【用密鑰加密原始數(shù)據(jù)】
????//?產(chǎn)生一個(gè)可信任的隨機(jī)數(shù)源
????SecureRandom?sr?=?new?SecureRandom();
????//從密鑰文件key?Filename中得到密鑰數(shù)據(jù)
????Byte?rawKeyData?[]?=?FileUtil.readFile?(key?Filename);
????//?從原始密鑰數(shù)據(jù)創(chuàng)建DESKeySpec對(duì)象
????DESKeySpec?dks?=?new?DESKeySpec?(rawKeyData);
????//?創(chuàng)建一個(gè)密鑰工廠,然后用它把DESKeySpec轉(zhuǎn)換成Secret?Key對(duì)象
????SecretKeyFactory?key?Factory?=?SecretKeyFactory.getInstance("DES"?);
????Secret?Key?key?=?keyFactory.generateSecret(?dks?);
????//?Cipher對(duì)象實(shí)際完成加密操作
????Cipher?cipher?=?Cipher.getInstance(?"DES"?);
????//?用密鑰初始化Cipher對(duì)象
????cipher.init(?Cipher.ENCRYPT_MODE,?key,?sr?);
????//?獲取需要加密的數(shù)據(jù)str
????Byte?data?[]?=?str.getBytes();
????//?執(zhí)行加密操作
????Byte?encryptedClassData?[]?=?cipher.doFinal(data?);
????//?保存到數(shù)據(jù)庫中
(3)解密數(shù)據(jù)。操作步驟如下所示。?
【用密鑰解密數(shù)據(jù)】
????//?生成一個(gè)可信任的隨機(jī)數(shù)源
????SecureRandom?sr?=?new?SecureRandom();
????//?從密鑰文件中獲取原始密鑰數(shù)據(jù)
????Byte?rawKeyData[]?=?Util.readFile(?keyFilename?);
????//?創(chuàng)建一個(gè)DESKeySpec對(duì)象
????DESKeySpec?dks?=?new?DESKeySpec?(rawKeyData);
????//?創(chuàng)建一個(gè)密鑰工廠,然后用它把DESKeySpec對(duì)象轉(zhuǎn)換成Secret?Key對(duì)象?
????SecretKeyFactory?key?Factory?=?SecretKeyFactory.getInstance(?"DES"?);
????SecretKey?key?=?keyFactory.generateSecret(?dks?);
????//?Cipher對(duì)象實(shí)際完成解密操作
????Cipher?cipher?=?Cipher.getInstance(?"DES"?);
????//?用密鑰初始化Cipher對(duì)象
????Cipher.init(?Cipher.DECRYPT_MODE,?key,?sr?);
????//?從數(shù)據(jù)庫中獲得經(jīng)過加密的數(shù)據(jù)str
????Byte?encrypted?Data?[]?=?str.getBytes();
????//執(zhí)行解密操作
????Byte?decryptedData?[]?=?cipher.doFinal(?encryptedData?);
????//?然后將解密后的數(shù)據(jù)顯示給客戶。?
????我們需要開始在新系統(tǒng)里使用數(shù)據(jù)加密,如果不是在目前的系統(tǒng)里使用的話。我認(rèn)為這是項(xiàng)很大的工程,這也就是為什么我說在新系統(tǒng)里使用數(shù)據(jù)加密,而不是在舊系統(tǒng)里加上數(shù)據(jù)加密功能。最好方法就是從那些你最常使用的數(shù)據(jù)庫的提供廠商那里開始:Oracle、IBM和微軟。然后看看大量的第三方供應(yīng)商和其他互聯(lián)網(wǎng)安全專家能夠提供什么。無論你從哪里開始,最好都是今天開始,以免讓自己成為明天報(bào)紙的頭條新聞。
posted on 2006-12-16 11:55 都市淘沙者 閱讀(981) 評(píng)論(0) 編輯 收藏 所屬分類: 加密解密/其他分類