使用Druid的ConfigFilter对数据库密码加解密

本文介绍了如何使用Druid的ConfigFilter对数据库密码进行加密,并提供了生成公钥私钥的方法。展示了如何在Spring Boot项目中配置Druid DataSource,包括通过Config工具、自定义DBPasswordCallback和application.properties来实现密码解密。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用Druid的ConfigFilter对数据库密码加解密

一、maven引入druid jar包
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.26</version>
</dependency>
二、对数据库密码加密得到公钥、私钥和加密后的密码
[root@zhenglei opt]# ll
total 3436
-rw-r--r-- 1 root root 3514896 Oct 22 20:21 druid-1.2.1.jar
[root@zhenglei opt]# java -cp druid-1.2.1.jar com.alibaba.druid.filter.config.ConfigTools root
privateKey:MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAuI9AhaiApmmHqkDS5g66N2/dBrCJ/3759TNULsGVmwxBkreFoG2TvFBn/yjDxbt+lV7QFzMsUBmnh02SxXR0QQIDAQABAkAZ7NWNcOwRdEWAXvbBJlR2MRqFNAtOfpGyJfGvV7YiP0tthnrTmBm/vFDmBs6GqnVgsWLKsRd4XBP8vYzsqm6BAiEA2Wr7/iiFOMdECjDX/xU2X7FodKqY5NJnJM0V0+BgZ+kCIQDZT45b+YXEPiA0I9xnjCzpolB4HrAhvjls2Px37EVKmQIhALxzG8q3iomlRldi8MV7uG6HUlfVSsMDkD14udO1ZzqJAiApXX5wvYeb+mNw6V6cC0/FTVNZ+iV21tnhgVBVl5D9CQIgHtzLXwg3hptKUCUnIfmvDux+mGVlad6H+C1qQ9vAaUw=
publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALiPQIWogKZph6pA0uYOujdv3Qawif9++fUzVC7BlZsMQZK3haBtk7xQZ/8ow8W7fpVe0BczLFAZp4dNksV0dEECAwEAAQ==
password:oAXjNHBKX5BYwsu/MlbuyZvHHijFl0c78vhPqki83oWnOZnHW4z0WjrcImtPbGdh0MV69KyWYPICoLpczg9KXw==

在这里插入图片描述

也可以使用druid工具类生成公钥、私钥和密码

//生成密码
System.out.println(ConfigTools.encrypt("私钥", "root"));
//其他 API 点击源码ConfigTools
三、创建项目
1. 在application.properties中配置数据源
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://39.98.152.206:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
# 密码,使用druid jar生成的密文
spring.datasource.password=oAXjNHBKX5BYwsu/MlbuyZvHHijFl0c78vhPqki83oWnOZnHW4z0WjrcImtPbGdh0MV69KyWYPICoLpczg9KXw==
# 公钥
db.public_key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALiPQIWogKZph6pA0uYOujdv3Qawif9++fUzVC7BlZsMQZK3haBtk7xQZ/8ow8W7fpVe0BczLFAZp4dNksV0dEECAwEAAQ==
2. 创建Configuration配置文件
@Configuration
public class DBConfig {

    @Value("${db.public_key}")
    private String publickey;
    @Value("${spring.datasource.driver-class-name}")
    private String className;
    @Value("${spring.datasource.url}")
    private String url;
    @Value("${spring.datasource.username}")
    private String username;
    @Value("${spring.datasource.password}")
    private String password;

    @Bean
    public DataSource dataSource() throws SQLException {
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName(className);
        ds.setUrl(url);
        ds.setUsername(username);
        ds.setPassword(password);
        //配置 解密
        //设置ConfigFilter为config
        ds.setFilters("config");
        //设置公钥
        ds.setConnectionProperties("config.decrypt=true;config.decrypt.key="+publickey);
        return ds;
    }
}
三、其他方式

若密码解密的方式特殊,可以用extends DruidPasswordCallback方式,重写setProperties方法进行密码解密。这种方式需要将密码 设置到connectionProperties才能在DruidPasswordCallback的Properties 中获取到密码进行解密。

1. 新建DBPasswordCallback 继承DruidPasswordCallback类
public class DBPasswordCallback extends DruidPasswordCallback {

    //公钥
    private String publicKey;
    public DBPasswordCallback(String publicKey) {
        this.publicKey = publicKey;
    }

    @Override
    public void setProperties(Properties properties) {
        super.setProperties(properties);
        String pwd = properties.getProperty("password");
        if (StringUtils.isNotBlank(pwd)) {
            try {
                //将密码进行解密
                String password = ConfigTools.decrypt(publicKey, pwd);
                setPassword(password.toCharArray());
            } catch (Exception e) {
                setPassword(pwd.toCharArray());
            }
        }
    }

}
2. 配置application.properties
# 数据库设置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://39.98.152.206:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=dWtdFRwUuKsm3XgHvp4eKNtp/xT+Tj6i7gqIZWZuUu5SY1fGJY4s5/d4Z2Y1txha6qyyrELx1bllc1+lw73hnouPNjhNpabPoPUeUKcJ0GSK/bjHzRkKdvo5fHFk0RAZ6ODMoJCA83JJpX6XKURpqzX1SR676NZsKq2vXr7+gIM=

jdbc.connection-properties=password=${spring.datasource.password}
jdbc.public_key=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDpmRAcZuqejYP83XUNiLeV7lMhPUXL9Q5myzpfUthOXdsj2hiMPQvRh0aFG1v1faeI1mGeGuMai3xPlt0qdKZ3FX6ZUM5mMG+JRbqeFbeUNmjgrePhCK5byamtxr6NEheCYvNjsCk6Hz1O+hQPtN4GkKC5eUhvCXAiOmPZa+mUSQIDAQAB
jdbc.private_key=MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAOmZEBxm6p6Ng/zddQ2It5XuUyE9Rcv1DmbLOl9S2E5d2yPaGIw9C9GHRoUbW/V9p4jWYZ4a4xqLfE+W3Sp0pncVfplQzmYwb4lFup4Vt5Q2aOCt4+EIrlvJqa3Gvo0SF4Ji82OwKTofPU76FA+03gaQoLl5SG8JcCI6Y9lr6ZRJAgMBAAECgYEAi7oLogGJe3eIqJtK5eKOdbdNsEc3Va1qhOAxNU2XpyCK8SIGpvPo+tbgvsPDuM8FhFs/ntPUXk9q9yx1dGy8GMCImui7X3YJlDUt83t/ab5cZCovNeijqjVkPtlAFPlKPLrh/2wIbsrtzUXyfNCKyIffLNk3LqdNAmazq/rfiwECQQD3FdpxGQHJFOgWvIG1MEk0NJ65fQDFhMsT2TFmAQMhH6PY06u8M/v/xQMc86vEGL5wFRN7CEB2+vXjR2GyK7rhAkEA8gaixWpHGv/yPbRluwqIpqV6pEituxIW3WLMhdcd++sdfgSq302Zyda9AwzmCIfw1+weM/um+9x+SvAfGpWuaQJBAJDiOpXI4Rgk7zat0K0LJFG9bTk9CF/Jzz7TQ7kZbNlWcUAqVnBkVycSQhIO/DBfhgO5CBRDsXFTFS3xZGMSa2ECQF/rzVscke3bfrCB7MfClwIlF4RA4coAk1tOquxoo5OSTXACfY5e/RKHrwWkeQ7sgcGx7Q6BMF8ltlAQ9uLca/ECQQCQn4gTxcFxSXSLHP/QkJOmHuaIr8GpO2MX3Us0DQFb8DCyxjRsitWkDtJYsbf9F3G0LGjX/bi2gnzdf7lINkaY
3. 创建Configuration配置文件
@Configuration
public class DBConfig {

    @Value("${spring.datasource.driver-class-name}")
    private String className;
    @Value("${spring.datasource.url}")
    private String url;
    @Value("${spring.datasource.username}")
    private String username;
    @Value("${spring.datasource.password}")
    private String password;
    @Value("${jdbc.connection-properties}")
    private String connectionProperties;
    @Value("${jdbc.public_key}")
    private String publicKey;
    @Value("${jdbc.private_key}")
    private String privateKey;

    @Bean
    public DataSource dataSource() throws SQLException {
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName(className);
        ds.setUrl(url);
        ds.setUsername(username);
        ds.setPassword(password);
        
        //设置解密
        ds.setConnectionProperties(connectionProperties);
        ds.setPasswordCallback(new DBPasswordCallback(publicKey));
        return ds;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值