druid加解密功能

对于线上环境和运维来说,都不希望数据库密码以明文的形式写在配置文件中,druid支持对密码使用RSA算法进行加密。

 

druid的加解密类是ConfigTools,这个类提供生成公钥、私钥、密文、加密、解密等一系列方法。

我们可以通过main方法对我们的密码进行加密:

复制代码
public class ConfigTools {

    private static final String DEFAULT_PRIVATE_KEY_STRING = "MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAocbCrurZGbC5GArEHKlAfDSZi7gFBnd4yxOt0rwTqKBFzGyhtQLu5PRKjEiOXVa95aeIIBJ6OhC2f8FjqFUpawIDAQABAkAPejKaBYHrwUqUEEOe8lpnB6lBAsQIUFnQI/vXU4MV+MhIzW0BLVZCiarIQqUXeOhThVWXKFt8GxCykrrUsQ6BAiEA4vMVxEHBovz1di3aozzFvSMdsjTcYRRo82hS5Ru2/OECIQC2fAPoXixVTVY7bNMeuxCP4954ZkXp7fEPDINCjcQDywIgcc8XLkkPcs3Jxk7uYofaXaPbg39wuJpEmzPIxi3k0OECIGubmdpOnin3HuCP/bbjbJLNNoUdGiEmFL5hDI4UdwAdAiEAtcAwbm08bKN7pwwvyqaCBC//VnEWaq39DCzxr+Z2EIk=";
    public static final String DEFAULT_PUBLIC_KEY_STRING = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKHGwq7q2RmwuRgKxBypQHw0mYu4BQZ3eMsTrdK8E6igRcxsobUC7uT0SoxIjl1WveWniCASejoQtn/BY6hVKWsCAwEAAQ==";

    public static void main(String[] args) throws Exception {
        String password = args[0];
        String[] arr = genKeyPair(512);
        System.out.println("privateKey:" + arr[0]);
        System.out.println("publicKey:" + arr[1]);
        System.out.println("password:" + encrypt(arr[0], password));
    }
  ...
}
复制代码

我们运行这个main方法,传入明文:

 

 运行之后在控制台会输出公钥、和私钥以及加密后的密文

 

在生成我们需要的公、私钥以及密文后,我们就可以使用加密后的密码进行配置数据源。

复制代码
    public static DataSource dataSource() throws SQLException {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/ds0?serverTimezone=UTC");
        dataSource.setUsername("root");
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
//添加Configfilter,该filter初始化后主要实现对密文的解密 dataSource.setFilters(
"config");
//设置是否解密为true dataSource.setConnectionProperties(
"config.decrypt=true");
//使用公钥解密 传入公钥串,如果没有传入公钥,则会使用默认的公钥 dataSource.setConnectionProperties(
"config.decrypt.key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIq+sud+LQwa2kjdVJOWewaqX0Bw0m0eHaRSwifmc+W6o/CFYAthoAem33Xi3MYtXsHumskHr9eIcEFjNyxloq0CAwEAAQ=="); //加密后的密码
dataSource.setPassword(
"e67LBYk981SvjeKbT/H6tYXjtoKDqOU2+s0+JAeUealvs64lJCCG8UgX6Z5yX6I8wtKdcjF4nUnwQPjXIMnhpg=="); return dataSource; }
复制代码

 

这样数据源就配置好了,在我们获取连接的时候druid会自动使用公钥解密该密码。具体逻辑在ConfigFilter中。我们看一下:

在调用DruiddataSource.getConnection的时候会对druid连接池进行初始化,初始化的过程中会初始化Filter。

复制代码
public void init(DataSourceProxy dataSourceProxy) {
        if (!(dataSourceProxy instanceof DruidDataSource)) {
            LOG.error("ConfigLoader only support DruidDataSource");
        }

        DruidDataSource dataSource = (DruidDataSource) dataSourceProxy;
        Properties connectionProperties = dataSource.getConnectProperties();

        Properties configFileProperties = loadPropertyFromConfigFile(connectionProperties);

        // 判断是否需要解密,如果需要就进行解密行动
        boolean decrypt = isDecrypt(connectionProperties, configFileProperties);

        if (configFileProperties == null) {
            if (decrypt) {
                decrypt(dataSource, null);
            }
            return;
        }

        if (decrypt) {
            decrypt(dataSource, configFileProperties);
        }

        try {
            DruidDataSourceFactory.config(dataSource, configFileProperties);
        } catch (SQLException e) {
            throw new IllegalArgumentException("Config DataSource error.", e);
        }
    }
复制代码

 

从代码中可以看出来,初始化该Filter的时候密码就已经被解密了,并且将明文密码重新设置在数据源属性中。

 

posted @   她曾是他的梦  阅读(1065)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示