主要是使用durid中的ConfigFilter实现,官方文档可参考这里,但是官方文档里没有介绍纯配置方式的用法,我自己试了下,总结了纯配置的用法。
第一步:生成密码和密钥
这一步可以使用官方文档里的办法,不想敲命令也可以使用一个我自己写的类(需要引入官方jar包),当然本质都是调用官方jar包中的方法:
<!-- 引入官方jar包,笔者本篇基于1.1.9-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.9</version>
</dependency>
package com.example.encryption;
import com.alibaba.druid.filter.config.ConfigTools;
public class Password {
public static void main(String[] args) throws Exception {
String password = "mypassword";
String[] arr = ConfigTools.genKeyPair(512);
System.out.println("privateKey:" + arr[0]);
System.out.println("publicKey:" + arr[1]);
System.out.println("password:" + ConfigTools.encrypt(arr[0], password));
}
}
将mypassword改成你的密码就可以了,输出如下:
第二步:配置,这里我直接给一个例子,再细说
spring:
datasource:
druid:
filters: config
connectionProperties: "config.decrypt=true;config.decrypt.key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJytZ2OPWf2cpYSlZCGB9CvvG71FumkVC1RveYW2H2PTeCdAPinHlSHJBVnE9eQbQlW/GupIOVK+kY+arlhnJZsCAwEAAQ=="
url: jdbc:mysql://localhost:3306/my_test_db?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
username: root
password: SUEikVmE5+S9BvYdvhUPGqPBBiX/qkyPx10/lpTwzlS6j44/eSt7a5ipYXd38h0GSlp+uSOoCsP5kKAvrjUfuw==
driver-class-name: com.mysql.cj.jdbc.Driver
- 配置名为config的filters
- 配置connectionProperties属性,key的内容修改为上一步输出的公钥
- 修改密码为加密后的密码
ps:
- 如果已经配置其他filter,直接使用’,'后面跟上config就行
filters: stat,config
- connectionProperties属性直接以一个字符串给出,没有使用yml格式,因为“config.decrypt”既作为属性,又作为节点,感觉不是规范的yml写法。如果要写成yml,笔者怎么写都不对,有大佬知道也可以指教一下,以下是我试过的两个不行的写法
connectionProperties:
config:
decrypt: true
decrypt.key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJytZ2OPWf2cpYSlZCGB9CvvG71FumkVC1RveYW2H2PTeCdAPinHlSHJBVnE9eQbQlW/GupIOVK+kY+arlhnJZsCAwEAAQ==
connectionProperties:
config:
decrypt: true
key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJytZ2OPWf2cpYSlZCGB9CvvG71FumkVC1RveYW2H2PTeCdAPinHlSHJBVnE9eQbQlW/GupIOVK+kY+arlhnJZsCAwEAAQ==
更新:单纯这样配置之后是保证不了安全的,com.alibaba.druid.filter.config.ConfigFilter最终还是会用解密后的明文密码去访问数据库,所以拿到公钥和加密后的密码,再使用ConfigFilter中的解密方法很容易就可以解出明文密码,这只能算是一个障眼法。想办法把公钥和密文密码放在不同的地方,才能说增强了安全性。