最近系统检查出漏洞,说有源代码明文存储了数据库的帐号密码,通过检查发现是在hibernate的配置文件hibernate.cfg.xml中出现的。
解决方案如下,第一步:先在配置文件中自定义一个连接供应器,
<property name="hibernate.connection.username">ac64c580ffade131ebbdd6c071a0290d</property>
<property name="hibernate.connection.password">a33b2d3d5afbc783c9cb29e7cf94fe6d</property>
<property name="connection.provider_class">com.utils.NewConnectionProvider</property>
这里面的username和password是已经经过加密的,所以连接供应器里面,需要进行解密。
第二步,连接供应器
package com.utils;
import java.util.Properties;
import org.hibernate.HibernateException;
import org.hibernate.cfg.Environment;
import org.hibernate.connection.DriverManagerConnectionProvider;
import com.szhome.commons.log.LogUtil;
import com.tds.encry.awt.TdsAESUtil;
/*
* 自定义数据库连接供应器,目的是解密配置文件中的数据库帐号密码
* 2018年3月17日
*/
public class NewConnectionProvider extends DriverManagerConnectionProvider {
public NewConnectionProvider() {
super();
}
@Override
public void configure(Properties props) throws HibernateException{
String user = props.getProperty(Environment.USER);
String password = props.getProperty(Environment.PASS);
try {
props.setProperty(Environment.USER, TdsAESUtil.decrypt(user));
props.setProperty(Environment.PASS, TdsAESUtil.decrypt(password));
} catch (Exception e) {
LogUtil.error("解密数据库帐号密码异常:"+e.getMessage(),e);
}
super.configure(props);
}
}
其中加密算法是用了AES加密,这个网上有很多,就不提供了。
这样就实现了hibernate配置文件中对数据库帐号密码加密了。