使用Druid的ConfigFilter对数据库密码加解密
一、maven引入druid jar包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.26</version>
</dependency>
二、对数据库密码加密得到公钥、私钥和加密后的密码
[root@zhenglei opt]# ll
total 3436
-rw-r--r-- 1 root root 3514896 Oct 22 20:21 druid-1.2.1.jar
[root@zhenglei opt]# java -cp druid-1.2.1.jar com.alibaba.druid.filter.config.ConfigTools root
privateKey:MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAuI9AhaiApmmHqkDS5g66N2/dBrCJ/3759TNULsGVmwxBkreFoG2TvFBn/yjDxbt+lV7QFzMsUBmnh02SxXR0QQIDAQABAkAZ7NWNcOwRdEWAXvbBJlR2MRqFNAtOfpGyJfGvV7YiP0tthnrTmBm/vFDmBs6GqnVgsWLKsRd4XBP8vYzsqm6BAiEA2Wr7/iiFOMdECjDX/xU2X7FodKqY5NJnJM0V0+BgZ+kCIQDZT45b+YXEPiA0I9xnjCzpolB4HrAhvjls2Px37EVKmQIhALxzG8q3iomlRldi8MV7uG6HUlfVSsMDkD14udO1ZzqJAiApXX5wvYeb+mNw6V6cC0/FTVNZ+iV21tnhgVBVl5D9CQIgHtzLXwg3hptKUCUnIfmvDux+mGVlad6H+C1qQ9vAaUw=
publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALiPQIWogKZph6pA0uYOujdv3Qawif9++fUzVC7BlZsMQZK3haBtk7xQZ/8ow8W7fpVe0BczLFAZp4dNksV0dEECAwEAAQ==
password:oAXjNHBKX5BYwsu/MlbuyZvHHijFl0c78vhPqki83oWnOZnHW4z0WjrcImtPbGdh0MV69KyWYPICoLpczg9KXw==
也可以使用druid工具类生成公钥、私钥和密码
//生成密码
System.out.println(ConfigTools.encrypt("私钥", "root"));
//其他 API 点击源码ConfigTools
三、创建项目
1. 在application.properties中配置数据源
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://39.98.152.206:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
# 密码,使用druid jar生成的密文
spring.datasource.password=oAXjNHBKX5BYwsu/MlbuyZvHHijFl0c78vhPqki83oWnOZnHW4z0WjrcImtPbGdh0MV69KyWYPICoLpczg9KXw==
# 公钥
db.public_key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALiPQIWogKZph6pA0uYOujdv3Qawif9++fUzVC7BlZsMQZK3haBtk7xQZ/8ow8W7fpVe0BczLFAZp4dNksV0dEECAwEAAQ==
2. 创建Configuration配置文件
@Configuration
public class DBConfig {
@Value("${db.public_key}")
private String publickey;
@Value("${spring.datasource.driver-class-name}")
private String className;
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Bean
public DataSource dataSource() throws SQLException {
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName(className);
ds.setUrl(url);
ds.setUsername(username);
ds.setPassword(password);
//配置 解密
//设置ConfigFilter为config
ds.setFilters("config");
//设置公钥
ds.setConnectionProperties("config.decrypt=true;config.decrypt.key="+publickey);
return ds;
}
}
三、其他方式
若密码解密的方式特殊,可以用extends DruidPasswordCallback方式,重写setProperties方法进行密码解密。这种方式需要将密码 设置到connectionProperties才能在DruidPasswordCallback的Properties 中获取到密码进行解密。
1. 新建DBPasswordCallback 继承DruidPasswordCallback类
public class DBPasswordCallback extends DruidPasswordCallback {
//公钥
private String publicKey;
public DBPasswordCallback(String publicKey) {
this.publicKey = publicKey;
}
@Override
public void setProperties(Properties properties) {
super.setProperties(properties);
String pwd = properties.getProperty("password");
if (StringUtils.isNotBlank(pwd)) {
try {
//将密码进行解密
String password = ConfigTools.decrypt(publicKey, pwd);
setPassword(password.toCharArray());
} catch (Exception e) {
setPassword(pwd.toCharArray());
}
}
}
}
2. 配置application.properties
# 数据库设置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://39.98.152.206:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=dWtdFRwUuKsm3XgHvp4eKNtp/xT+Tj6i7gqIZWZuUu5SY1fGJY4s5/d4Z2Y1txha6qyyrELx1bllc1+lw73hnouPNjhNpabPoPUeUKcJ0GSK/bjHzRkKdvo5fHFk0RAZ6ODMoJCA83JJpX6XKURpqzX1SR676NZsKq2vXr7+gIM=
jdbc.connection-properties=password=${spring.datasource.password}
jdbc.public_key=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDpmRAcZuqejYP83XUNiLeV7lMhPUXL9Q5myzpfUthOXdsj2hiMPQvRh0aFG1v1faeI1mGeGuMai3xPlt0qdKZ3FX6ZUM5mMG+JRbqeFbeUNmjgrePhCK5byamtxr6NEheCYvNjsCk6Hz1O+hQPtN4GkKC5eUhvCXAiOmPZa+mUSQIDAQAB
jdbc.private_key=MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAOmZEBxm6p6Ng/zddQ2It5XuUyE9Rcv1DmbLOl9S2E5d2yPaGIw9C9GHRoUbW/V9p4jWYZ4a4xqLfE+W3Sp0pncVfplQzmYwb4lFup4Vt5Q2aOCt4+EIrlvJqa3Gvo0SF4Ji82OwKTofPU76FA+03gaQoLl5SG8JcCI6Y9lr6ZRJAgMBAAECgYEAi7oLogGJe3eIqJtK5eKOdbdNsEc3Va1qhOAxNU2XpyCK8SIGpvPo+tbgvsPDuM8FhFs/ntPUXk9q9yx1dGy8GMCImui7X3YJlDUt83t/ab5cZCovNeijqjVkPtlAFPlKPLrh/2wIbsrtzUXyfNCKyIffLNk3LqdNAmazq/rfiwECQQD3FdpxGQHJFOgWvIG1MEk0NJ65fQDFhMsT2TFmAQMhH6PY06u8M/v/xQMc86vEGL5wFRN7CEB2+vXjR2GyK7rhAkEA8gaixWpHGv/yPbRluwqIpqV6pEituxIW3WLMhdcd++sdfgSq302Zyda9AwzmCIfw1+weM/um+9x+SvAfGpWuaQJBAJDiOpXI4Rgk7zat0K0LJFG9bTk9CF/Jzz7TQ7kZbNlWcUAqVnBkVycSQhIO/DBfhgO5CBRDsXFTFS3xZGMSa2ECQF/rzVscke3bfrCB7MfClwIlF4RA4coAk1tOquxoo5OSTXACfY5e/RKHrwWkeQ7sgcGx7Q6BMF8ltlAQ9uLca/ECQQCQn4gTxcFxSXSLHP/QkJOmHuaIr8GpO2MX3Us0DQFb8DCyxjRsitWkDtJYsbf9F3G0LGjX/bi2gnzdf7lINkaY
3. 创建Configuration配置文件
@Configuration
public class DBConfig {
@Value("${spring.datasource.driver-class-name}")
private String className;
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${jdbc.connection-properties}")
private String connectionProperties;
@Value("${jdbc.public_key}")
private String publicKey;
@Value("${jdbc.private_key}")
private String privateKey;
@Bean
public DataSource dataSource() throws SQLException {
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName(className);
ds.setUrl(url);
ds.setUsername(username);
ds.setPassword(password);
//设置解密
ds.setConnectionProperties(connectionProperties);
ds.setPasswordCallback(new DBPasswordCallback(publicKey));
return ds;
}
}