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