摘 要:本文首先分析了資料庫資料需要加密的原因,簡要介紹了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和微軟。然後看看大量的第三方供應商和其他互連網安全專家能夠提供什麼。無論你從哪裡開始,最好都是今天開始,以免讓自己成為明天報紙的頭條新聞。