Druid数据库密码加密

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+i
publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALvajIEy0Onxb3CM6S7MS1+0Vo7qJGkf9SRtZYbeP01HShObhS8yRKJCA36CEwJ9fI/y9Xg7odyYQOajGoV4/T8CAwEAAQ==
password:kBmEh1dmpF1QyDCx6q1Pw7LrB3XIWRNSO0CWSrV1xwpn26vrxZkYddfuxiMq2JZWfskDFrFPvrAcrN9iqov9lA==

2、修改配置
将publicKey和password和密码填写到application.yml对应位置。

示例一:(验证)

项目中改入druid库:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.16</version>
</dependency>

数据库连接配置文件:

复制代码
spring:
    datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        druid:
            # 主库数据源
            master:
                url: jdbc:mysql://localhost:3306/lhb_sys?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                username: root
                password: kBmEh1dmpF1QyDCx6q1Pw7LrB3XIWRNSO0CWSrV1xwpn26vrxZkYddfuxiMq2JZWfskDFrFPvrAcrN9iqov9lA==
                publicKey:  MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALvajIEy0Onxb3CM6S7MS1+0Vo7qJGkf9SRtZYbeP01HShObhS8yRKJCA36CEwJ9fI/y9Xg7odyYQOajGoV4/T8CAwEAAQ==
                connection-properties: config.decrypt=true;config.decrypt.key=${spring.datasource.druid.master.publicKey}
            # 从库数据源
            slave:
                # 从数据源开关/默认关闭
                enabled: false
                url: 
                username: 
                password: 
            filter:
                stat:
                    enabled: true
                    # 慢SQL记录
                    log-slow-sql: true
                    slow-sql-millis: 1000
                    merge-sql: true
                wall:
                    config:
                        multi-statement-allow: true
                config:
                    enabled: true
复制代码

 

示例二:

复制代码
spring.datasource.url=jdbc:mysql://localhost:3306/user?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
# 生成的加密后的密码(原密码 password)
spring.datasource.password=pqQuEhP1PPVUPN5qmFV4gh81n06B98X1mdWpg6DnVgcAOEFFMln72AuydH55Dk1yokczHP42OzoFL99xOPvN/w==
# 生成的公钥
public-key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAK2pQSm/lqbrwuDAq/aE7CwrSa7PBbqZQ/6PTeB4K7OzzFnN8pHm2ygtaSvbruFtEGElxNiAeRoZnY0SOO/sX/8CAwEAAQ==
# 配置 connection-properties,启用加密,配置公钥。
spring.datasource.druid.connect-properties.config.decrypt=true
spring.datasource.druid.connect-properties.config.decrypt.key=${public-key}
# 启用ConfigFilter
spring.datasource.druid.filter.config.enabled=true
复制代码

 

 

方法二:实现密码回调类自定义加解密

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

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


1、创建密码回调类
druid还支持密码加解密的扩展功能 继承DruidPasswordCallback类重写setProperties方法

复制代码
@Slf4j
public class DbPasswordCallback extends DruidPasswordCallback {

    @Override
    public 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-8
spring.datasource.username=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.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.DbPasswordCallback
spring.datasource.druid.connect-properties.publicKey=${public-key}
spring.datasource.druid.connect-properties.password=${password}
复制代码

 

原文地址:https://blog.csdn.net/wlddhj/article/details/132579298

 

posted on   咚..咚  阅读(361)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示