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

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

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

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

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

当然,你也可以使用自己写的加密方法,或者是[url=http://java.sun.com/j2se/1.4.2/docs/guide/security/jce/JCERefGuide.html]Java官方[/url]推荐的一些加密方法
调用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>

第一二行是加密后的密文,第三行是使用自定义的连接器

如果使用第三方的连接器,CustomDriverManagerConnectionProvider则需要继承于相应的连接器,如C3P0ConnectionProvider

第二种:[url=http://sklst.iteye.com/blog/284689]使用Hibernate官方推荐的Jasypt[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值