一般情况下开发都是在数据库配置文件中使用的明文密码,但在一些特殊情况下也会需要对其进行加密,否则会造成数据泄露。
最近公司刚好有这个需求,趁此机会将我的实现方法写下来以供大家参考。
原理:直接重写DataSource类的setPassword方法
创建一个DataSource类继承spring-mybatis.xml文件中配置的DataSource类,然后重写它的setUsername和setPassword方法。
如下:
数据源:dbcp
<bean id="dataSource" class="com.util.MyDataSource" destroy-method="close">
<property name="driverClassName" value="${driverClassName}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${user}"></property>
<property name="password" value="${password}"></property>
<!-- 连接池启动时的初始值 -->
<property name="initialSize" value="7"/>
<!-- 连接池的最大值 -->
<property name="maxActive" value="20"/>
<!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
<property name="maxIdle" value="7"/>
<!-- 最小空闲值.当空闲的连接数少于该值时,连接池就会预申请一些连接,以避免洪峰来时再申请而造成的性能开销 -->
<property name="minIdle" value="5"/>
<property name="maxWait" value="60000"/>
</bean>
<context:property-placeholder location="classpath:jdbc.properties"/>
我这里原本的配置是“org.apache.commons.dbcp.BasicDataSource”,我自己的DataSource类就继承它
package com.util;
import java.io.UnsupportedEncodingException;
import java.util.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.commons.dbcp.BasicDataSource;
public class MyDataSource extends BasicDataSource {
private final static Logger logger = LoggerFactory.getLogger(MyDataSource.class);
public MyDataSource() {
super();
}
@Override
public void setPassword(String password){
try{
super.setPassword(decode(password));
}catch(Exception e){
logger.error(e.getMessage());
}
}
@Override
public void setUsername(String username) {
try{
super.setUsername(decode(username));
}catch(Exception e){
logger.error(e.getMessage());
}
}
//加密
public static String encodeToString(String password){
//编码
String str=null;
try {
str = Base64.getEncoder().encodeToString(password.getBytes("utf-8"));
//System.out.println("编码结果为:"+str);
} catch (UnsupportedEncodingException e) {
logger.error(e.getMessage());
}
return str;
}
//解密
public static String decode(String password){
//解码
String str=null;
byte[] str1=Base64.getDecoder().decode(password);
try {
str = new String(str1,"utf-8");
//System.out.println("解码结果为:"+str);
} catch (UnsupportedEncodingException e) {
logger.error(e.getMessage());
}
return str;
}
// public static void main(String[] args) {
// encodeToString("sqqtest");
// decode(encodeToString("199771"));
// }
}
然后再将配置文件中原本的“org.springframework.jdbc.datasource.DriverManagerDataSource”改成自己的类
最后将jdbc.properties文件中的用户名和密码改为加密后的文本就可以了。
driverClassName=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
user=******
password=***********
补充一下,JDK的版本为1.8或以上,最近才发现如果JDK的版本是1.7就会出错
以上就是mybatis-数据库配置文件密码加密的全部内容,如果有不同见解欢迎在评论区交流。
参考:PZ-eng