今天收到客户的一个要求,把数据源配置文件中的用户名和密码做加密处理,经过对ibatis源码的了解,做出了如下解决方案:
1.创建自定义类
EncryptDataSourceFactory 实现接口com.ibatis.sqlmap.engine.datasource.DataSourceFactory
public class EncryptDataSourceFactory implements DataSourceFactory {
private static final Logger LOGGER = Logger.getLogger(EncryptDataSourceFactory.class);
private DataSource dataSource;
@Override
public void initialize(Map map) {
String username = (String) map.get("JDBC.Username");
String password = (String) map.get("JDBC.Password");
username = EncryptUtil.decodeByJackHash(username);
// password解密
password = EncryptUtil.decodeByJackHash(password);
map.put("JDBC.Username", username);
map.put("JDBC.Password", password);
dataSource = new SimpleDataSource(map);
}
@Override
public DataSource getDataSource() {
return dataSource;
}
}
2.sqlMapConfig配置文件修改
添加配置
<typeAlias alias="ENCRYPT" type="***.***.***.EncryptDataSourceFactory" />
修改dataSource的type,对应添加配置中的alias
<dataSource type="ENCRYPT">
完整配置如下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<settings cacheModelsEnabled="true" lazyLoadingEnabled="true"
enhancementEnabled="true" errorTracingEnabled="true" maxSessions="1024"
maxTransactions="512" maxRequests="2048" useStatementNamespaces="true" />
<!-- 使用JDBC的事务管理 -->
<typeAlias alias="ENCRYPT" type="***.***.***.EncryptDataSourceFactory" />
<transactionManager type="JDBC">
<!-- 数据源 -->
<dataSource type="ENCRYPT">
<property name="JDBC.Driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="JDBC.ConnectionURL" value="jdbc:oracle:thin:@192.168.50.122:1521:****" />
<property name="JDBC.Username" value="TllOYm4wM2g=" />
<property name="JDBC.Password" value="TllOYm4wM2g=" />
</dataSource>
</transactionManager>
<!-- 这里可以写多个实体的映射文件 -->
</sqlMapConfig>
如此就完成了对配置文件中用户名密码的加密处理,但是做完后,仔细想想,这种处理没什么必要,当某人可以接触到配置文件时,也就可以找到相关jia包,反编译出来,什么都知道了。