druid数据库账号密码加密
前言:
我们为什么需要数据库密码加密?
相信我们开发时,数据库的密码是以明文的形式存储在配置文件中,这种方式会存在非常大的安全隐患!
步骤如下:
1.数据库密码加密:
语法:java -cp druid-1.1.10.jar com.alibaba.druid.filter.config.ConfigTools 密码
privateKey | 私钥 |
---|---|
publicKey | 公钥 |
password | 密文(就是我们加密后的密码) |
2.dataSource配置
2.0.1 druid.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/saas-export?characterEncoding=utf8
#username公钥
jdbc.usernamePublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAN7L7hBwvGqHc/8IMrxEDk35C89UcZARbGlb91PFFuGfXltXQiGu7pAmnh4YXtWpJTMrcKuUMeLeIq3ou+HIUgECAwEAAQ==
#username密文
jdbc.username=yd5SBXMIRrOoGpEc5TzkRsTr+DO1V3pRQr7Y5b65ByLQy8sBH0gPxL1zklo/S1Drp3hskSje7alqAFKF2deY5Q==
#password密文公钥
jdbc.pwdPublickey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALHD1xPgYgKQV7pdgTC2l9I2gn9lX2mKTSWa1cHFdB2xi7IBwOVhAbYXacxYrlMoGnQ0D8Mxeg8EFmGs45BbVw0CAwEAAQ==
#password密文
jdbc.password=VRndsoMVIMqR1U3k0hgnFI7Nd3gva/5eL/+UolerC5M4Wvu6lHLc4WKSXlYqEJ9h4zXPsIFbP0Uj7m0L8T6gsA==
#初始连接数
jdbc.initialSize=5
#最大连接数
jdbc.maxActive=50
#最大空闲
jdbc.maxWait=30000
#最小空闲
jdbc.minIdle=3
2.0.2 配置数据源(dataSource)
<context:property-placeholder location="classpath:properties/druid.properties"/>
<bean id="dataSource" class="cn.zonhar.datasource.DecryptDruidSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<!--注入username公钥-->
<property name="usernamePublicKey" value="${jdbc.usernamePublicKey}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="initialSize" value="${jdbc.initialSize}"/>
<property name="maxActive" value="${jdbc.maxActive}"/>
<property name="maxWait" value="${jdbc.maxWait}"/>
<property name="minIdle" value="${jdbc.minIdle}"/>
<!---数据库密码进行解密-->
<property name="filters" value="config" />
<property name="connectionProperties" value="config.decrypt=true;config.decrypt.key=${jdbc.pwdPublickey}" />
</bean>
3.继承DruidDataSource并重写setUserName方法
package cn.zonhar.datasource;
import com.alibaba.druid.filter.config.ConfigTools;
import com.alibaba.druid.pool.DruidDataSource;
public class DecryptDruidSource extends DruidDataSource {
//用户名公钥
private String usernamePublicKey;
@Override
public void setUsername(String username) {
try {
//加密密码+公钥(publicKey)解密=明文密码
username = ConfigTools.decrypt(usernamePublicKey,username);
} catch (Exception e) {
e.printStackTrace();
}
super.setUsername(username);
}
//setter方法给IOC容器注入
public void setUsernamePublicKey(String usernamePublicKey) {
this.usernamePublicKey = usernamePublicKey;
}
}