为Hibernate配置文件加密的三套解决方案(一)

为Hibernate配置文件加密的三套解决方案(一)

Hibernate配置文件hibernate.cfg.xml中存放了我们连接数据库的相关信息,其中设计到许多数据库的敏感信息,比如连接地址,用户名和密码,有时候我们交由发布组进行发布时并不希望他们看到数据库的连接密码,就需要对hibernate配置文件中的部分信息进行加密,我在解决这一问题中实践了三种方法,第一种是重载连接供应器,第二种是使用Hibernate官方推荐的Jasypt,第三种其实算不上是加密,而是使用WebLogic连接池将相关信息放在WebLogic的配置中,下面会具体阐述这三种方法。

第一种重载连接供应器:
这种方法是我在网上看到的,原文连接是:
http://blog.csdn.net/sdbany/archive/2008/10/23/3132809.aspx

但是在实际使用的时候发现代码有问题,可能是作者没有贴全,所以有些功能无法实现,于是我重新写了代码。

首先创建一个连接供应器,配置文件里的参数解释都是此类负责,所以,只要在此类中进行密文解密即可。

Java代码
  1. import java.util.Properties;   
  2.   
  3. import org.hibernate.HibernateException;   
  4. import org.hibernate.cfg.Environment;   
  5. import org.hibernate.connection.DriverManagerConnectionProvider;   
  6.   
  7. public class CustomDriverManagerConnectionProvider extends  
  8.         DriverManagerConnectionProvider {   
  9.   
  10.     public CustomDriverManagerConnectionProvider() {   
  11.         super();   
  12.     }   
  13.        
  14.     @Override  
  15.     public void configure(Properties props) throws HibernateException{   
  16.         String user = props.getProperty(Environment.USER);   
  17.         String password = props.getProperty(Environment.PASS);   
  18.         props.setProperty(Environment.USER, SecUtil.decrypt(user));   
  19.         props.setProperty(Environment.PASS, SecUtil.decrypt(password));   
  20.         super.configure(props);   
  21.     }   
  22.        
  23. }  
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负责字符串的加密与解密这里我们参照原作者的方法
Java代码
  1. /**  
  2.  * AES加密工具  
  3.  *   
  4.  * @author Bany  
  5.  *   
  6.  * @version 创建时间:2008-8-5 上午10:58:16  
  7.  *   
  8.  */  
  9.   
  10. public class SecUtil {   
  11.   
  12.     private static byte[] keybytes = { 0x310x32, …… };   
  13.   
  14.     public static void main(String[] args) throws Exception {   
  15.         String e1 = encrypt("newpassword");   
  16.         System.out.println(e1);   
  17.         String e2 = decrypt(e1);   
  18.         System.out.println(e2);   
  19.     }   
  20.   
  21.     /**  
  22.      * 加密  
  23.      * @param value  
  24.      * @return  
  25.      */  
  26.     public static String encrypt(String value) {   
  27.            
  28.         String s=null;   
  29.   
  30.         int mode = Cipher.ENCRYPT_MODE;   
  31.   
  32.         try {   
  33.             Cipher cipher = initCipher(mode);   
  34.   
  35.             byte[] outBytes = cipher.doFinal(value.getBytes());   
  36.   
  37.             s = String.valueOf(Hex.encodeHex(outBytes));   
  38.         } catch (Exception e) {   
  39.             e.printStackTrace();   
  40.         }   
  41.   
  42.         return s;   
  43.     }   
  44.   
  45.     /**  
  46.      * 解密  
  47.      * @param value  
  48.      * @return  
  49.      */  
  50.     public static String decrypt(String value) {   
  51.   
  52.         String s = null;   
  53.   
  54.         int mode = Cipher.DECRYPT_MODE;   
  55.   
  56.         try {   
  57.             Cipher cipher = initCipher(mode);   
  58.   
  59.             byte[] outBytes = cipher.doFinal(Hex.decodeHex(value.toCharArray()));   
  60.   
  61.             s = new String(outBytes);   
  62.         } catch (Exception e) {   
  63.             e.printStackTrace();   
  64.         }   
  65.   
  66.         return s;   
  67.     }   
  68.        
  69.     private static Cipher initCipher(int mode) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException{   
  70.         Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");   
  71.         Key key = new SecretKeySpec(keybytes, "AES");   
  72.         cipher.init(mode, key);   
  73.         return cipher;   
  74.     }   
  75. }  
/**
* 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文件
Xml代码
  1. <property name="connection.username">c59cd98</property>  
  2. <property name="connection.password">68e32593ea5943a6a</property>  
  3. <property name="connection.provider_class">com.CustomDriverManagerConnectionProvider</property>  

你可能感兴趣的:(为Hibernate配置文件加密的三套解决方案(一))