这次来详细说下 Druid 数据库密码加密-代码详解
第一种方法使用原生加解密
- 首先需要使用druid的密码加密功能加密密码 > 找到druid jar文件地址 执行 加密命令
java -cp druid-1.2.10.jar com.alibaba.druid.filter.config.ConfigTools you_password
会得到以下信息
privateKey:MIIBVgIBADANBgkqhkiG9w0BAQEFAASCAUAwggE8AgEAAkEA6+4avFnQKP+O7bu5YnxWoOZjv3no4aFV558HTPDoXs6EGD0HP7RzzhGPOKmpLQ1BbA5viSht+aDdaxXp6SvtMQIDAQABAkAeQt4fBo4SlCTrDUcMANLDtIlax/I87oqsONOg5M2JS0jNSbZuAXDv7/YEGEtMKuIESBZh7pvVG8FV531/fyOZAiEA+POkE+QwVbUfGyeugR6IGvnt4yeOwkC3bUoATScsN98CIQDynBXC8YngDNwZ62QPX+ONpqCel6g8NO9VKC+ETaS87wIhAKRouxZL38PqfqV/WlZ5ZGd0YS9gA360IK8zbOmHEkO/AiEAsES3iuvzQNYXFL3x9Tm2GzT1fkSx9wx+12BbJcVD7AECIQCD3Tv9S+AgRhQoNcuaSDNluVrL/B/wOmJRLqaOVJLQGg==
publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAOvuGrxZ0Cj/ju27uWJ8VqDmY7956OGhVeefB0zw6F7OhBg9Bz+0c84RjzipqS0NQWwOb4kobfmg3WsV6ekr7TECAwEAAQ==
password:PNak4Yui0+2Ft6JSoKBsgNPl+A033rdLhFw+L0np1o+HDRrCo9VkCuiiXviEMYwUgpHZUFxb2FpE0YmSguuRww==
privateKey,不需要管是私钥信息;publicKey,公钥信息解密时会用到;password,加密后的密码,解密时会用到;
2. 项目配置信息 yaml 下配置
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://ip:port/database?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false
username: root
password: 加密后的密码
#数据源连接池配置
druid:
filters: config
connect-properties:
config.decrypt: true
config.decrypt.key: 公钥
可以看到多出配置的两个参数 filters,connect-properties
filters这是druid实现的过滤器 定义多个用英文逗号(,)分隔 这次我们只看config 也就是 configFilter
从源文件来看 该类主要使用来解密时使用的
所以filters: config 配置就尤为重要了
再往下看
在ConfigFilter#init方法中会获取参数config.decrypt: true判断是否需要解密密码
进入decrypt方法
在ConfigFilter#decrypt方法中会获取参数config.decrypt.key: 公钥,加密后的密码 ,使用ConfigTools#decrypt方法进行解密然后设置解密后的密码到参数中
ConfigTools应该很眼熟 在第一步加密时我们使用的也是 ConfigTools类进行加密的
第二种方法使用实现密码回调类自定义加解密
druid还支持密码加解密的扩展功能 继承DruidPasswordCallback类重写setProperties方法
创建回调类
继承DruidPasswordCallback类 实现setProperties 获取加密后的密码与公钥 调用ConfigTools#decrypt获取到解密后的密码
然后设置到password中
第一步加密的方法不变修改下配置文件
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://ip:port/database?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false
username: root
password: 加密后的密码
#数据源连接池配置
druid:
connect-properties:
publicKey: 公钥
password: 加密后的密码
password-callback-class-name: com.xxx.xxx.DbPasswordCallback
password-callback-class-name 就是你创建回调的类的名称
在DruidAbstractDataSource#setPasswordCallbackClassName中会将填入的类名进行加载回填到passwordCallback参数中
然后看druid代码 在创建数据库连接时进行相关操作
在DruidAbstractDataSource#createPhysicalConnection
会检测是否实现了DruidPasswordCallback类 执行setProperties 方法时会执行我们上边实现的方法 然后将解密后的密码赋值