之前写了一篇加密springboot项目配置的文章,不过那个是使用Jasypt加密spring boot应用配置文件的敏感信息,那个比较灵活,在需要加密的配置项中将值使用ENC(s1IqO0kn3jDReVSk7ZLiHOVxsTN89nm/exox2AhdtG1sH2Jd7PEXIILoS4YenkuP)这种方式将加密好的字符串包裹起来,然后再使用Jasypt中对应的方法解密就可以了。不过那个使用起来有点麻烦,所以如果你只是想把数据源连接中的用户密码加密配置,那么使用Druid的自带的加解密的方法就非常方便
最近项目中对数据安全要求较高,运维组要求项目中的数据源的用户密码需要加密配置,所以总结一下使用druid加解密用户密码的方法
项目中使用的是多数据源,所以加入了dynamic-datasource,连接池用的druid
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<!-- 引入druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.22</version>
</dependency>
<!-- 引入Mysql Jdbc驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
<scope>runtime</scope>
</dependency>
数据源配置文件:application-datasource-dev.yml
spring:
datasource:
dynamic:
druid:
# 连接池的配置信息
# 初始化大小,最小,最大
initialSize: 5
maxActive: 15
minIdle: 5
# 配置获取连接等待超时的时间
maxWait: 60000
# 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
poolPreparedStatements: false
#要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100
maxPoolPreparedStatementPerConnectionSize: -1
validationQuery: select 'x'
#单位:秒,检测连接是否有效的超时时间。底层调用jdbc Statement对象的void setQueryTimeout(int seconds)方法
validationQueryTimeout: 60
#申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testOnBorrow: true
# 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testOnReturn: true
#建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
testWhileIdle: true
#连接保持空闲而不被驱逐的最小时间
#minEvictableIdleTimeMillis:
#物理连接初始化的时候执行的sql
#connectionInitSqls:
#当数据库抛出一些不可恢复的异常时,抛弃连接
#exceptionSorter:
#属性类型是字符串,通过别名的方式配置扩展插件,常用的有stat,wall,slf4j
filters: stat,slf4j,wall
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
primary: master
strict: false
datasource:
# 基础默认数据库
master:
url: jdbc:mysql://ip:3306/shema?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&useTimezone=true&serverTimezone=GMT%2B8
#连接数据库的用户名
username: usrname
#连接数据库的密码。如果你不希望密码直接写在配置文件中,可以使用ConfigFilter。
password: FVF21nuP7Kqxtmsr6j0ZXWY/phsAcYJhN0FkYcKVjWBVkoFuJJ3Ib/nlA2BjikmBHUX8O4QOlwyMfQ1CDQx/4A==
druid:
initial-size: 10
public-key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALropniRk4wOwosZklGLh95cd7wq2sdhBFOJzYNb/0sDGodEt967LstvSuy7yezn3ajYC9/+OB0/B3zIxjbZca0CAwEAAQ==
dataSource2:
url: jdbc:mysql://ip:3306/schema?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&useTimezone=true&serverTimezone=GMT%2B8
#连接数据库的用户名
username: username
#连接数据库的密码。如果你不希望密码直接写在配置文件中,可以使用ConfigFilter。
password: DN6HdJeWRivk5wVuoVkqg+OXH72corCNVsrCIGGQtt3t6b+HeMiFKwxlXKFvEIyNkbc3sTn0QzAKwhsFwhm0nA==
druid:
initial-size: 10
public-key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ6IQ97Ih0EVLva2yi1PzfOyWg13LB6RDjjZ6IYU2ozuEKsvSegbcnPR/4riQpnMeVrDa9TeSg03hS4zJtv7foUCAwEAAQ==
dataSource3:
url: jdbc:mysql://ip:3306/shema?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&useTimezone=true&serverTimezone=GMT%2B8
#连接数据库的用户名
username: username
#连接数据库的密码。如果你不希望密码直接写在配置文件中,可以使用ConfigFilter。
password: DN6HdJeWRivk5wVuoVkqg+OXH72corCNVsrCIGGQtt3t6b+HeMiFKwxlXKFvEIyNkbc3sTn0QzAKwhsFwhm0nA==
druid:
initial-size: 10
public-key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ6IQ97Ih0EVLva2yi1PzfOyWg13LB6RDjjZ6IYU2ozuEKsvSegbcnPR/4riQpnMeVrDa9TeSg03hS4zJtv7foUCAwEAAQ==
mybatis:
configuration:
map-underscore-to-camel-case: true
# flyway:
# # 暂不开启
# enabled: false
# encoding: UTF-8
# locations: ["classpath:db/migration"]
之前使用明文密码的时候,没有password下边这一段配置的
现在把这段配置加上,然后把明文的密码替换成加密后的密码字符串
接下来介绍如何生成加密的密码字符串以及生成公钥和私钥
首先找到druid的jar包在本地maven库的位置:
比如我的是在这个地址:
然后在地址栏输入powershell回车,打开powershell程序
打开的powershell会自动定位到当前的目录位置
然后输入命令
java -cp druid-1.1.22.jar com.alibaba.druid.filter.config.ConfigTools xiaomifeng1010
比如 xiaomifeng1010是你的最初的原始密码
回车后,就会生成加密后的密码字符串以及公钥和私钥
然后我们把最下边的password字符串和publicKey的值复制到配置文件中就可以了
然后再重新启动项目,发现是可以正常启动的,druid会自动根据你的加密字符串和公钥自动解密密码为原始密码xiaomifeng1010,其他的不用修改,直接默认使用druid的加解密方法就可以了,还是很简单易用的
注意在每个数据源单独配置initail-size的时候,数量不能超过全局的配置的最大激活数量
最上边单独配置druid的地方也有一个初始化数量和最大激活数量
所以如果下边的每个单独数据源设置initial-size=20,启动项目则会报错