项目中使用JDBC连接数据库,一般配置如下:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
p:driverClassName="oracle.jdbc.driver.OracleDriver"
p:url="jdbc:oracle:thin:@127.0.0.1:1521:orcl"
p:username="test"
p:password="test" />
如果有用户这台服务器访问权限(比如root),就可以看到这个applicationContext.xml文件,并且打开文件获取数据库的用户和密码,所以不够安全,需要对这里的密码进行加密。
首先,将配置文件中这些value抽取到property文件中。
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="classpath:jdbc.properties"
p:fileEncoding="utf-8" />
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
p:driverClassName="${driverClassname}"
p:url="${url}"
p:username="${username}"
p:password="${passwd}" />
PropertyPlaceholderConfigurer类是负责抓取jdbc.properties中的属性值,填充到dataSource中相应的位置。
接下来,将jdbc.properties中的密码值进行压缩(可以使用其它方式),得到一个不易记忆的字符串,这需要实现PropertyPlaceholderConfigurer(extends PropertyResourceConfigurer)的解密方法convertProperty。
package net.jdbc.util;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import net.jdbc.util.ZipUtil;
public class JdbcPwdPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer{
@Override
protected String convertProperty(String propertyName, String propertyValue) {
System.out.println(propertyName + " -> " + propertyValue);
if("passwd".equals(propertyName)){
return ZipUtil.unzip(propertyValue);
}
return propertyValue;
}
}
然后在配置文件中,将JdbcPwdPropertyPlaceholderConfigurer类替换PropertyPlaceholderConfigurer。
<bean class="net.jdbc.util.JdbcPwdPropertyPlaceholderConfigurer"
p:location="classpath:jdbc.properties"
p:fileEncoding="utf-8"/>
jdbc.properties文件内容如下:
driverClassname=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
username=test
passwd=UEsDBBQACAgIAK5QqUoAAAAAAAAAAAAAAAABAAAAMCtJLS4BAFBLBwgMfn/YBgAAAAQAAAA=
进行单元测试,打印日志内容。
driverClassname -> oracle.jdbc.driver.OracleDriver
url -> jdbc:oracle:thin:@127.0.0.1:1523:orcl
username -> test
passwd -> UEsDBBQACAgIAK5QqUoAAAAAAAAAAAAAAAABAAAAMCtJLS4BAFBLBwgMfn/YBgAAAAQAAAA=