程序中使用了.properties文件作為參數配置文檔,好處是靈活配置各項參數
一旦對數據庫的一些參數進行了配置,勢必涉及數據庫的IP,端口,用戶名和密碼
properties文件全是unicode編碼明文存儲,程序打包交付后,其他人能夠很容易使用解壓軟件打開jar查看你的.properties文件
所以一些敏感變量需要加密處理
首先需要了解一些基本的加密算法,比如MD5,比如DES和RSA
MD5是一種不可逆的加密算法,使用散列后特征碼的方式表現需要加密的字符或者文件,常用在系統登陸的密碼比對中
將MD5碼存儲在數據庫中,用戶登陸時將用戶輸入的字符散列成MD5后於數據庫中的密文進行比對
不可逆的加密算法有一種好處就是,即使后台數據庫被攻破了,對方拿這些MD5散列密文也毫無辦法求得明文
DES和RSA都是可逆的加密算法,也就是可以通過密鑰和密文解開得到明文,其中最常見的64位輪轉DES算法
在JAVA的JDK中提供了先天性的良好的加密支持,其中就包括大名鼎鼎的DES
下面一個DESHelper類展示了如何將密文解開得到明文的方法
package com.newflypig.des; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import sun.misc.BASE64Decoder; /** * 處理數據庫密碼的密文轉明文類 * @author newflypig * time:2015年10月30日 * TODO * */ public class DESHelper { /** * Description 根據鍵值進行解密 * @param data * @param key 加密鍵byte數組 * @return * @throws Exception */ private static byte[] decrypt(byte[] data, byte[] key) throws Exception { // 生成一個可信任的隨機數源 SecureRandom sr = new SecureRandom(); // 從原始密鑰數據創建DESKeySpec對象 DESKeySpec dks = new DESKeySpec(key); // 創建一個密鑰工廠,然后用它把DESKeySpec轉換成SecretKey對象 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey securekey = keyFactory.generateSecret(dks); // Cipher對象實際完成解密操作 Cipher cipher = Cipher.getInstance("DES"); // 用密鑰初始化Cipher對象 cipher.init(Cipher.DECRYPT_MODE, securekey, sr); return cipher.doFinal(data); } public static String decrypt(String data, String key) throws Exception { if (data == null) return null; BASE64Decoder decoder = new BASE64Decoder(); byte[] buf = decoder.decodeBuffer(data); byte[] bt = decrypt(buf, key.getBytes()); return new String(bt); } }
如需對加密算法有更深刻的了解,可以自行研究實現原理,對於敏捷開發這里只需要不求甚解的運用就行了,記得保護好你的key也就是密鑰
一開始提到的需要將properties文件中的參數解開得到明文,想必你應該已經知道該使用哪種加密算法了吧
對了,就是上面的DES加密算法,這里只提供了解密,因為不需要在程序中提供加密函數
各位可以自己編寫自己的加密函數,或者可以在自己的JUnit測試里面寫加密的語句用來對數據庫密碼進行加密。