電子商務使用資料加密來保護資料庫 (二)

來源:互聯網
上載者:User
電子商務使用資料加密來保護資料庫 (二)
上篇講解了一些理論上的內容,這次我們詳細介紹一下例子:

例如,我們建立一個類DESUtil.java

按照上次講的,我要首先要建立一個密鑰,所以先增加一個方法,用來建立DES密鑰。為了使用方便,我們暫時把所有的方法寫成靜態方法。
//filename是要儲存的檔案路徑
public static void createKey(String filename) throws Exception{
//產生一個可信任的隨機數源
SecureRandom sr = new SecureRandom();
//為我們選擇的DES演算法產生一個KeyGenerator對象
KeyGenerator kg = KeyGenerator.getInstance("DES");
kg.init(sr);
//產生密鑰
Key key = kg.generateKey();
//將密鑰資料儲存為檔案供以後使用
writeFile(key,filename); //稍候講解
}

好了,我們可以通過上面的方法產生密鑰了。
因為我們可能會在不同的地方調用加密或者解密的方法,所以我們必須把產生密鑰的儲存在一個檔案中,推薦儲存到應用的/WEB-INF/的某個目錄下,因為那個目錄只由自己的程式調用,不能通過URL訪問,所以更安全。接下來我們要寫兩個方法,一個將金鑰儲存區到檔案,另一個則是在加密或者解密的方法中讀出密鑰進行加密或者解密。

//filename是金鑰儲存區的路徑,msg是我們用第一個方法產生的密鑰
public static void writeFile(Key msg, String filePath) {
try {
File file = new File(filePath);
if (file.exists()) {
file.delete();
}
FileOutputStream wf = new FileOutputStream(file);
ObjectOutputStream out = new ObjectOutputStream(wf);
out.writeObject(msg);
out.close();
file = null;
wf = null;
} catch (IOException e) {
debug(e.getMessage());
}
}
//filename是金鑰儲存區的路徑
public static Key readFile(String filePath) {
Key key = null;
try {
File f = new File(filePath);
if (f.exists()) {
FileInputStream bw = new FileInputStream(f);
ObjectInputStream in = new ObjectInputStream(bw);
key = (Key)in.readObject();
in.close();
bw = null;
}
f = null;
} catch (Exception e) {
debug(e.getMessage());
}
return key;
}

這裡我們直接把金鑰組象整個存到了檔案中,當然也可以用位元組的方式儲存,但是中間可以會有些小麻煩噢!

好了,現在密鑰的問題也解決了,我們接下來的工作就是寫加密和解決的方法了。

//str 要加密的位元組數組
public static byte[] DataEncrypt(byte[] str,String filename) throws Exception{
//
SecretKey key = (SecretKey)readFile(filename);
//Cipher對象實際完成加密操作
Cipher cipher = Cipher.getInstance("DES");
//用密鑰初始化Cipher對象
cipher.init(Cipher.ENCRYPT_MODE, key);
//執行加密操作
byte[] encryptedData = cipher.doFinal(str);
//
return encryptedData;
}
//str 要解密的位元組數組
public static byte[] DataDecrypt(byte[] str,String filename) throws Exception{
//
SecretKey key = (SecretKey)readFile(filename);
//Cipher對象實際完成加密操作
Cipher cipher = Cipher.getInstance("DES");
//用密鑰初始化Cipher對象
cipher.init(Cipher.DECRYPT_MODE, key);
//執行加密操作
byte[] encryptedData = cipher.doFinal(str);
//
return encryptedData;
}

簡單吧,我們已經成功的建立了DES加密,解密的類了。測試一下吧!

public static void main(String[] args) {
String filename = "c:/des.key";
String str = "0109103746028";
System.out.print("source="+str);
try {
DESUtil.createKey(filename);
//
byte[] enstr = DESUtil.DataEncrypt(str.getBytes(),filename);
str = new String(enstr);//加密後的字串
System.out.print("encrypt=" + str);
//
byte[] destr = DESUtil.DataDecrypt(str.getBytes(),filename);
str = new String(destr);//解密後的字串
System.out.print("decrypt=" + str);
} catch (Exception e) {
e.printStackTrace();
}
debug("ok");
}

如果沒有定錯的話,一定報錯了: javax.crypto.BadPaddingException: Given final block not properly padded
怎麼回事,都是按照你的寫的,怎麼會不對呢?仔細分析一下,不難發現,該異常是在解密的時候拋出的,加密的方法沒有問題。

但是兩個方法的唯一差別是Cipher對象的模式不一樣,這就排除了程式寫錯的可能性。再看一下異常的揭示資訊,大概的意思是:提供的字塊不符合填補的。什麼意思???原來在用DES加密的時候,最後一位長度不足64的,它會自動填補到64,那麼在我們進行位元組數組到字串的轉化過程中,可以把它填補的不可見字元改變了,所以引發系統拋出異常。問題找到,怎麼解決呢?大家還記得郵件傳輸通常會把一些資訊編碼儲存,對了,就是Base64,那樣保證了資訊的完整性,所以我們就是利用一下下了。為了方便使用,我們再寫一個新的方法封裝一下原來的方法:
//
public static String DataEncrypt(String str){
String encrypt = null;
try{
byte[] ret = DataEncrypt(str.getBytes("UTF-8"),filename);
encrypt = new String(Base64.encode(ret),"UTF-8");
}catch(Exception e){
System.out.print(e);
encrypt = str;
}
return encrypt;
}
//
public static String DataDecrypt(String str){
String decrypt = null;
try{
byte[] ret =  DataDecrypt(Base64.decode(str.getBytes("UTF-8")),filename);
decrypt =  new String(ret,"UTF-8");
}catch(Exception e){
System.out.print(e);
decrypt = str;
}
return decrypt;
}

我們把方法的參數改成了字串,但是為什麼要用UTF-8呢?不指定它的位元組格式不行嗎?大家知道,UTF-8是國際通用的字元編碼,用它傳輸任何字串都不會有問題,通過它也可以很完美的解決J2EE的中文問題!所以我們最好用UTF-8編碼,以減少不必要的麻煩。

注意,上面方法中當加密或者解密過程中,程式拋出異常,將返回原值,使得在調用方法失敗時更方便的找出錯誤。

大家也可以利用其它的密鑰,進行不同地方的加密解埽?

總結:DES是一個相對比較老的密碼編譯演算法,對於現在也不是最安全的,所以大家也可以利用別的密碼編譯演算法進行加密解密,以得到更安全的系統。

附:DESUtil.java及Base64.java的源檔案

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.