Druid的ConfigTools工具类使用了RSA非对称加密算法来进行密码加密。它通过生成公钥和私钥对来进行加密和解密操作。具体的加密原理如下:

  1. 首先,ConfigTools会生成一对RSA公钥和私钥。
  2. 原始密码会使用私钥进行加密,生成密文。ConfigTools.encrypt(String key, String plainText)
  3. 密文可以被保存在配置文件或数据库中,以便在需要时进行解密。
  4. 当需要验证密码时,可以使用公钥对密文进行解密,还原成原始密码进行比较。 ConfigTools.decrypt(String publicKeyText, String cipherText)

方法一:使用原生加解密

1、执行命令生成密文

java -cp [druid-1.1.22.jar仓库路径] [com.alibaba.druid.filter.config.ConfigTools] [密码]

示例:

java -cp druid-1.1.22.jar com.alibaba.druid.filter.config.ConfigTools 123456# 执行结果:privateKey:MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAu9qMgTLQ6fFvcIzpLsxLX7RWjuokaR/1JG1lht4/TUdKE5uFLzJEokIDfoITAn18j/L1eDuh3JhA5qMahXj9PwIDAQABAkAUC2jsrFBwdguvFcoX7UKprqOB0mgaM4fD4ExyDKrygtbG00665AeZofXgJ3oVmwRut0jkB43qia7tqMkwreDJAiEA9LYoekmSHZBExJu7H51RCqcThsNDYTq+ka/0f/ll7sUCIQDEhPJFkoi9+yAT8L+e099iNu50xbhM2x61yl6MJKd8MwIhAMe5mKXeQBxS8F2LQRmXe1p3bK9z1R2ZJYqgkqyUcAaFAiEAtFLpnD1hjDIqtSFsM2lmyNBu7mefPaay/0y6hQ39QVECIGXaCl+unaPVbmkVIauZPYMLrqmXW7MVEwJ7VDBx7j+ipublicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALvajIEy0Onxb3CM6S7MS1+0Vo7qJGkf9SRtZYbeP01HShObhS8yRKJCA36CEwJ9fI/y9Xg7odyYQOajGoV4/T8CAwEAAQ==password:kBmEh1dmpF1QyDCx6q1Pw7LrB3XIWRNSO0CWSrV1xwpn26vrxZkYddfuxiMq2JZWfskDFrFPvrAcrN9iqov9lA==

2、修改配置

publicKeypassword和密码填写到application.xml对应位置

示例一:动态数据源配置

spring:datasource:dynamic:datasource:master:url: jdbc:mysql://127.0.0.1:3306/test_db?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghaiusername: rootpassword: kBmEh1dmpF1QyDCx6q1Pw7LrB3XIWRNSO0CWSrV1xwpn26vrxZkYddfuxiMq2JZWfskDFrFPvrAcrN9iqov9lA==druid:public-key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALvajIEy0Onxb3CM6S7MS1+0Vo7qJGkf9SRtZYbeP01HShObhS8yRKJCA36CEwJ9fI/y9Xg7odyYQOajGoV4/T8CAwEAAQ==driver-class-name: com.mysql.cj.jdbc.Driver

使用动态数据源时,只要配置public-key就可以,因为在下面方法中根据public-key自动设置了参数
config.decryptconfig.decrypt.key
com.baomidou.dynamic.datasource.spring.boot.autoconfigure.druid.DruidConfig#toProperties

示例二:普通数据源配置

spring.datasource.url=jdbc:mysql://localhost:3306/user" />方法二:实现密码回调类自定义加解密 

密码回调可以在普通数据源和shardingsphere分库分表数据源上配置,无法在动态数据源上配置

注意:
1、shardingsphere分库分表数据源可配置密码回调,不能配置原生公钥加解密
2、动态数据源可以配置原生公钥加解密,不能配置密码回调

1、创建密码回调类

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

@Slf4jpublic class DbPasswordCallback extends DruidPasswordCallback {@Overridepublic void setProperties(Properties properties) {super.setProperties(properties);String password = properties.getProperty("password");String publicKey = properties.getProperty("publicKey");try {String dbpassword= ConfigTools.decrypt(publicKey,password);this.setPassword(dbpassword.toCharArray());}catch (Exception e){log.error("Druid数据库密码解密异常: {}", e.getMessage());}}}

2、修改配置文件

spring.datasource.url=jdbc:mysql://localhost:3306/user?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8spring.datasource.username=rootspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.type=com.alibaba.druid.pool.DruidDataSource# 生成的加密后的密码(原密码 password)password=pqQuEhP1PPVUPN5qmFV4gh81n06B98X1mdWpg6DnVgcAOEFFMln72AuydH55Dk1yokczHP42OzoFL99xOPvN/w==# 生成的公钥public-key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAK2pQSm/lqbrwuDAq/aE7CwrSa7PBbqZQ/6PTeB4K7OzzFnN8pHm2ygtaSvbruFtEGElxNiAeRoZnY0SOO/sX/8CAwEAAQ==# 配置 connection-properties,配置回调spring.datasource.druid.password-callback-class-name=com.hj.springevent.DbPasswordCallbackspring.datasource.druid.connect-properties.publicKey=${public-key}spring.datasource.druid.connect-properties.password=${password}