这次来详细说下 Druid 数据库密码加密-代码详解

第一种方法使用原生加解密

  1. 首先需要使用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==

Druid 数据库密码加密-代码详解_加解密


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

Druid 数据库密码加密-代码详解_安全_02


从源文件来看 该类主要使用来解密时使用的

所以filters: config 配置就尤为重要了

再往下看

Druid 数据库密码加密-代码详解_安全_03


在ConfigFilter#init方法中会获取参数config.decrypt: true判断是否需要解密密码

进入decrypt方法

Druid 数据库密码加密-代码详解_安全_04


在ConfigFilter#decrypt方法中会获取参数config.decrypt.key: 公钥,加密后的密码 ,使用ConfigTools#decrypt方法进行解密然后设置解密后的密码到参数中

ConfigTools应该很眼熟 在第一步加密时我们使用的也是 ConfigTools类进行加密的

第二种方法使用实现密码回调类自定义加解密

druid还支持密码加解密的扩展功能 继承DruidPasswordCallback类重写setProperties方法

创建回调类

Druid 数据库密码加密-代码详解_加解密_05


继承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 就是你创建回调的类的名称

Druid 数据库密码加密-代码详解_安全_06


在DruidAbstractDataSource#setPasswordCallbackClassName中会将填入的类名进行加载回填到passwordCallback参数中然后看druid代码 在创建数据库连接时进行相关操作

Druid 数据库密码加密-代码详解_java_07


在DruidAbstractDataSource#createPhysicalConnection

会检测是否实现了DruidPasswordCallback类 执行setProperties 方法时会执行我们上边实现的方法 然后将解密后的密码赋值