springboot+druid+dynamic-datasource+mysql数据库密码加密
背景
⽣产环境中, 希望将数据库密码加密, 甚⾄⽤户名加密。druid⾃带了数据库密码加密功能。
springboot+druid-starter实现密码加密
1. 获取公钥和加密密码。这⾥使⽤druid-start,官⽅有加密⽅法说明:
简单总结下就是:在本地maven仓库到druid的jar包, 然后在CMD窗⼝执⾏命令以下命令即可得到
java -cp druid-1.0.16.jar com.alibaba.fig.ConfigTools you_password
输出:
privateKey:MIIBVgIBADANBgkqhkiG9w0BAQEFAASCAUAwggE8AgEAAkEA6+4avFnQKP+O7bu5YnxWoOZjv3no4aFV558HTPDoXs6EGD0HP7RzzhGPOK mpLQ1BbA5viSht+aDdaxXp6SvtMQIDAQABAkAeQt4fBo4SlCTrDUcMANLDtIlax/I87oqsONOg5M2JS0jNSbZuAXDv7/YEGEtMKuIESBZh7pvVG8FV531/fyO ZAiEA+POkE+QwVbUfGyeugR6IGvnt4yeOwkC3bUoATScsN98CIQDynBXC8YngDNwZ62QPX+ONpqCel6g8NO9VKC+ETaS87wIhAKRouxZL38PqfqV/WlZ 5ZGd0YS9gA360IK8zbOmHEkO/AiEAsES3iuvzQNYXFL3x9Tm2GzT1fkSx9wx+12BbJcVD7AECIQCD3Tv9S+AgRhQoNcuaSDNluVrL/B/wOmJRLqaOVJLQ Gg==
publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAOvuGrxZ0Cj/ju27uWJ8VqDmY7956OGhVeefB0zw6F7OhBg9Bz+0c84RjzipqS0NQWwOb4kobfmg 3WsV6ekr7TECAwEAAQ==
password:PNak4Yui0+2Ft6JSoKBsgNPl+A033rdLhFw+L0np1o+HDRrCo9VkCuiiXviEMYwUgpHZUFxb2FpE0YmSguuRww==
2. 在springboot application配置⽂件中添加⼀下内容
如果是application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false
spring.datasource.username=root
# 步骤⼀⽣成的password, 即就是密码密码
spring.datasource.password=QNLWJMvsISqe85sel6w8lSjxis/JvJwnhA7BuqFAuMKJBysYZTVQqBQiOmdyJAiv6ulU2BPu0JeUU1wpWRoVrA==
# ⽣成的公钥
public-key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIj3KZDSeXpjJ0/cRoVXDvlvMCToCSxhZddVs8roF3Nq4/2I7MdmB7keqJstl+HcfYUtjrcclJFtpUZHz
Hbc14MCAwEAAQ==
# 配置 connection-properties,启⽤加密,配置公钥。
spring.tion-properties=config.decrypt=true;config.decrypt.key=${public-key}
# 启⽤ConfigFilter
spring.datasource.abled=true
如果是l
# 步骤⼀⽣成的publicKey⽣成的公钥
public-key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIj3KZDSeXpjJ0/cRoVXDvlvMCToCSxhZddVs8roF3Nq4/2I7MdmB7keqJstl+HcfYUtjrcclJFtpUZHz Hbc14MCAwEAAQ==
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb?useSSL=false
username: root
# 步骤⼀⽣成的password, 即就是密码密码
password: QNLWJMvsISqe85sel6w8lSjxis/JvJwnhA7BuqFAuMKJBysYZTVQqBQiOmdyJAiv6ulU2BPu0JeUU1wpWRoVrA==
driver-class-name: sql.jdbc.Driver
druid:
connection-properties: config.decrypt=true;config.decrypt.key=${public-key}
filter:
config:
enabled:true
springboot+dynamic-datasource-starter实现密码加密
该框架⾃带加密 ENC()。 功能说明如图
经过查看源码发现, 该框架使⽤⾃带的加密⼯具类com.baomidou.lkit.CryptoUtils进⾏加解密, 且⾃带有公钥私钥, 所以直接使⽤此⼯具类加密我们的明⽂密码, 然后⽤ENC()包裹即可实现加解密。
具体操作:
1. 调⽤加密⽅法
@Test
void test()throws Exception {
// 假如我们的密码为mysql下载jar包
String root = pt("root");
System.out.println(root);
// 输出加密密码
// VZamSTMi224AH6RUtJGXNldiDp/
}
2. 修改配置⽂件中的密码
spring:
datasource:
dynamic:
primary: master #设置默认的数据源或者数据源组,默认值即为master
strict:false#严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使⽤默认数据源
datasource:
master:
url: jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false
username: root
# ⽤ENC将密码包裹起来
password: ENC(VZamSTMi224AH6RUtJGXNldiDp/XEL2ozRhBUu/o9ChodT4JEb9kE/....)
druid:
# 选填
public-key:
通过查看源码还可以发现, ⽤户名/密码/数据库连接都可以使⽤此⽅法加密
// com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty
public String getUrl(){
return decrypt(url);
}
public String getUsername(){
return decrypt(username);
}
public String getPassword(){
return decrypt(password);
}
/**
* 字符串解密
*/
private String decrypt(String cipherText){
if(StringUtils.hasText(cipherText)){
Matcher matcher = ENC_PATTERN.matcher(cipherText);
if(matcher.find()){
try{
return CryptoUtils.decrypt(publicKey, up(1));
}catch(Exception e){
<("DynamicDataSourceProperties.decrypt error ", e);
}
}
}
return cipherText;
}
结束

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。