1. 程式人生 > >jdbc 加密之 DES 演算法

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 ,開啟一個需要訪問到資料庫的頁面測試下就行。

記得,寫配置檔案的時候,不要寫錯別字,,,博主踩了好多次坑!!!!