jdbc 加密之 DES 演算法
1.沒有加密前,我們的 jdbc.propertites 檔案的資訊上這樣的:
#沒有加密的
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/o2o?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=root
很明顯,這樣是不安全的做法,只要黑客一黑進來就能直接看到資料庫連線的賬號和密碼了,所以,我們最少也要對資料庫連線的賬號和密碼進行加密。下面就直接介紹如何用 DES 演算法來進行加解密。
2.DES 加密的 Java 實現
首先,我們要編寫一個 DES 加密的工具類來對資料庫的資訊進行加密。然後通過這個類裡面的 main 函式對 jdbc.username 和 jdbc.password 的明文資訊進行加密,然後把生成的密文複製貼上到 jdbc.propertites 裡面,如下圖。
注意:
需要匯入的包我直接給出了,所以不匯入錯誤的包,不用程式執行不了,還有,如果你用的編譯器上 Eclipse 或者 MyEclipse 的話,BASE64 的加密和解密的包可能沒辦法直接匯入,可以看的另外一篇部落格,很容易就可以解決的:
import java.security.Key; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; public class DESUtil { private static Key key; // 設定祕鑰key private static String KEY_STR = "myKey"; private static String CHARSETNAME = "UTF-8"; private static String ALGORITHM = "DES"; static { try { // 生成DES演算法物件 KeyGenerator generator = KeyGenerator.getInstance(ALGORITHM); // 運用SHA1安全策略 SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); // 設定上金鑰種子 secureRandom.setSeed(KEY_STR.getBytes()); // 初始化給於SHA1的演算法物件 generator.init(secureRandom); // 生成金鑰物件 key = generator.generateKey(); generator = null; } catch (Exception e) { throw new RuntimeException(e); } } /** * 獲取加密後的資訊 * * @param str * @return */ public static String getEncryptString(String str) { // 基於BASE64編碼,接受byte[]並轉換成String BASE64Encoder base64encoder = new BASE64Encoder(); try { // 按UTF8編碼 byte[] bytes = str.getBytes(CHARSETNAME); // 獲取加密物件 Cipher cipher = Cipher.getInstance(ALGORITHM); // 初始化密碼資訊 cipher.init(Cipher.ENCRYPT_MODE, key); // 加密 byte[] doFinal = cipher.doFinal(bytes); // byte[]to encode好的String並返回 return base64encoder.encode(doFinal); } catch (Exception e) { // TODO: handle exception throw new RuntimeException(e); } } /** * 獲取解密之後的資訊 * * @param str * @return */ public static String getDecryptString(String str) { // 基於BASE64編碼,接受byte[]並轉換成String BASE64Decoder base64decoder = new BASE64Decoder(); try { // 將字串decode成byte[] byte[] bytes = base64decoder.decodeBuffer(str); // 獲取解密物件 Cipher cipher = Cipher.getInstance(ALGORITHM); // 初始化解密資訊 cipher.init(Cipher.DECRYPT_MODE, key); // 解密 byte[] doFinal = cipher.doFinal(bytes); // 返回解密之後的資訊 return new String(doFinal, CHARSETNAME); } catch (Exception e) { // TODO: handle exception throw new RuntimeException(e); } } public static void main(String[] args) { System.out.println(getEncryptString("root")); System.out.println(getEncryptString("root")); } }
3.解密的JAVA實現
加密後,我們自然要實現相關的解密方法。
這裡通過 EncryptPropertyPlaceholderConfigurer.java 類的實現以及對 spring-dao.xml 檔案的配置來實現資料庫連線資訊的解密。
EncryptPropertyPlaceholderConfigurer.java 的實現程式碼
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer; public class EncryptPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer { // 需要加密的欄位陣列 private String[] encryptPropNames = { "jdbc.username", "jdbc.password" }; /** * 對關鍵的屬性進行轉換 */ @Override protected String convertProperty(String propertyName, String propertyValue) { if (isEncryptProp(propertyName)) { // 對已加密的欄位進行解密工作 String decryptValue = DESUtil.getDecryptString(propertyValue); return decryptValue; } else { return propertyValue; } } /** * 該屬性是否已加密 * * @param propertyName * @return */ private boolean isEncryptProp(String propertyName) { for (String encryptpropertyName : encryptPropNames) { if (encryptpropertyName.equals(propertyName)) return true; } return false; } }
這裡需要注意的是加密的欄位,如果你還加密了其他欄位的話,記得自己新增上去。
spring-dao.xml 配置檔案的修改:
<!-- <context:property-placeholder location="classpath:jdbc.properties"/> -->
<bean class="com.util.EncryptPropertyPlaceholderConfigurer">
<property name="locations">
<list>
<!-- 如果有其他加密檔案需要解密,需要繼續新增value,而value裡面放的上檔案的絕對路徑 -->
<value>classpath:jdbc.properties</value>
</list>
</property>
<property name="fileEncoding" value="UTF-8"></property>
</bean>
把原來配置 spring-dao.xml 配置的這句程式碼給註釋掉:
<context:property-placeholder location="classpath:jdbc.properties"/>
換成上面整個 bean 進去,然後記得把 bean class 的值修改成自己解密類的路徑,還有注意自己的 jdbc.properties 的路徑。
4.測試
到這裡,加密解密的步驟基本都做完了,現在就差測試了。
記得 jdbc.properties 記得換上密文資訊。
然後重啟下 tomcat ,開啟一個需要訪問到資料庫的頁面測試下就行。
記得,寫配置檔案的時候,不要寫錯別字,,,博主踩了好多次坑!!!!