Hibernate配置文件hibernate.cfg.xml中存放了我們連接數據庫的相關信息,其中設計到許多數據庫的敏感信息,比如連接地址,用戶名和密碼,有時候我們交由發布組進行發布時并不希望他們看到數據庫的連接密碼,就需要對hibernate配置文件中的部分信息進行加密,我在解決這一問題中實踐了三種方法,第一種是重載連接供應器,第二種是使用Hibernate官方推薦的Jasypt,第三種其實算不上是加密,而是使用WebLogic連接池將相關信息放在WebLogic的配置中,下面會具體闡述這三種方法。
第一種重載連接供應器:
這種方法是我在網上看到的,原文連接是:
http://blog.csdn.net/sdbany/archive/2008/10/23/3132809.aspx
但是在實際使用的時候發現代碼有問題,可能是作者沒有貼全,所以有些功能無法實現,于是我重新寫了代碼。
首先創建一個連接供應器,配置文件里的參數解釋都是此類負責,所以,只要在此類中進行密文解密即可。
- import java.util.Properties;
- import org.hibernate.HibernateException;
- import org.hibernate.cfg.Environment;
- import org.hibernate.connection.DriverManagerConnectionProvider;
- public class CustomDriverManagerConnectionProvider extends
- DriverManagerConnectionProvider {
- public CustomDriverManagerConnectionProvider() {
- super();
- }
- @Override
- public void configure(Properties props) throws HibernateException{
- String user = props.getProperty(Environment.USER);
- String password = props.getProperty(Environment.PASS);
- props.setProperty(Environment.USER, SecUtil.decrypt(user));
- props.setProperty(Environment.PASS, SecUtil.decrypt(password));
- super.configure(props);
- }
- }
再寫一個類,使用AES負責字符串的加密與解密這里我們參照原作者的方法
- /**
- * AES加密工具
- *
- * @author Bany
- *
- * @version 創建時間:2008-8-5 上午10:58:16
- *
- */
- public class SecUtil {
- private static byte[] keybytes = { 0x31, 0x32, …… };
- public static void main(String[] args) throws Exception {
- String e1 = encrypt("newpassword");
- System.out.println(e1);
- String e2 = decrypt(e1);
- System.out.println(e2);
- }
- /**
- * 加密
- * @param value
- * @return
- */
- public static String encrypt(String value) {
- String s=null;
- int mode = Cipher.ENCRYPT_MODE;
- try {
- Cipher cipher = initCipher(mode);
- byte[] outBytes = cipher.doFinal(value.getBytes());
- s = String.valueOf(Hex.encodeHex(outBytes));
- } catch (Exception e) {
- e.printStackTrace();
- }
- return s;
- }
- /**
- * 解密
- * @param value
- * @return
- */
- public static String decrypt(String value) {
- String s = null;
- int mode = Cipher.DECRYPT_MODE;
- try {
- Cipher cipher = initCipher(mode);
- byte[] outBytes = cipher.doFinal(Hex.decodeHex(value.toCharArray()));
- s = new String(outBytes);
- } catch (Exception e) {
- e.printStackTrace();
- }
- return s;
- }
- private static Cipher initCipher(int mode) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException{
- Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
- Key key = new SecretKeySpec(keybytes, "AES");
- cipher.init(mode, key);
- return cipher;
- }
- }
當然,你也可以使用自己寫的加密方法,或者是Java官方推薦的一些加密方法
調用SecUtil.encrypt的方法,把用戶密碼加密生成密文,然后根據密文修改hibernate.cfg.xml文件
- <property name="connection.username">c59cd98</property>
- <property name="connection.password">68e32593ea5943a6a</property>
- <property name="connection.provider_class">com.CustomDriverManagerConnectionProvider</property>