1.前置准备

项目中引入druid的相关依赖,使用工具类调用druid的jar包方法生成公钥私钥;通过私钥进行加密,公钥进行解密,先使用工具类生成一组私钥公钥,供后续加解密使用

/**
 * Druid加密工具类
 */
import com.alibaba.druid.filter.config.ConfigTools;

public class DruidPasswordEncryptor {
    public static void main(String[] args) {
        try {
            // 要加密的数据库密码
            String plainPassword = "root";

            // 使用Druid工具加密密码
            String[] keyPair = ConfigTools.genKeyPair(512);
            //私钥
            String privateKey = keyPair[0];
            //公钥
            String publicKey = keyPair[1];
            String encryptedPassword = ConfigTools.encrypt(privateKey, plainPassword);

            // 输出结果
            System.out.println("Private Key: " + privateKey);
            System.out.println("Public Key: " + publicKey);
            System.out.println("Encrypted Password: " + encryptedPassword);

            // 使用公钥进行解密验证加密是否正确
            String decryptedPassword = ConfigTools.decrypt(publicKey, encryptedPassword);
            System.out.println("Decrypted Password: " + decryptedPassword);
            System.out.println("Encryption verified: " + plainPassword.equals(decryptedPassword));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2.配置修改

修改配置文件,启用 ConfigFilter 加解密

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/jss_db?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai
    username: root
    password: YOUR_ENCRYPTED_PASSWORD_HERE  # 使用工具类加密后的密码
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource

    druid:
      # 连接池配置
      initial-size: 5
      min-idle: 5
      max-active: 20
      max-wait: 60000
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      validation-query: SELECT 1
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      pool-prepared-statements: true
      max-pool-prepared-statement-per-connection-size: 20

      # 启用 ConfigFilter 加解密
      #config.decrypt=true:开启解密,config.decrypt.key=你的公钥
      filters: config  # 必须包含 config
      connection-properties: config.decrypt=true;config.decrypt.key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJ...

      # Stat、Wall 等其他过滤器(可选)
      # filters: stat,wall,config

3.问题处理

如果启动报错:

Public Key Retrieval is not allowed

在数据库连接加上allowPublicKeyRetrieval=true,例如:

url: jdbc:mysql://127.0.0.1:3306/jssdb?useOldAliasMetadataBehavior=true&useSSL=false&serverTimezone=GMT&allowPublicKeyRetrieval=true

4.加密脚本

目录结构如图:

DruidPasswordEncryptor.java源码如下:

import com.alibaba.druid.filter.config.ConfigTools;

import java.util.Scanner;

public class DruidPasswordEncryptor {
    public static void main(String[] args) {

        try {
       // 检查是否提供了私钥参数
        if (args.length < 1) {
            System.err.println("错误: 请提供私钥作为命令行参数");
            System.err.println("用法: java -cp \".;druid-1.2.9.jar\" DruidPasswordEncryptor <私钥>");
            System.exit(1);
        }
        
        String privateKey = args[0];
            while (true){
                System.out.println("输入密码");
                Scanner scanner = new Scanner(System.in);
                String plainPassword = scanner.next();
                String encryptedPassword = ConfigTools.encrypt(privateKey, plainPassword);
                System.out.println("加密后的密码:");
                System.out.println(encryptedPassword);
            }

        } catch (Exception e) {
            throw new RuntimeException(e);
        }


    }

}

windows下 执行脚本生成.class文件:

javac -encoding UTF-8 -cp .;druid-1.2.9.jar DruidPasswordEncryptor.java

windows环境脚本内容如下,最后一个""内的是之前保存的私钥:

java -cp ".;druid-1.2.9.jar" DruidPasswordEncryptor "MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAgUA+/Cmtp7x249IQqFwe9iLFnOukbDfHWJEcyro+1Cc83kg3eYL1fyxkoGGfCijNqMxxzCuRIRs9pC5g+AQUfwIDAQABAkBL5sSWJIucEyrmQrgRhneQJ39Q1XirLF5efmkgDBtVThYqmDw+9dbbzEJr03uvg6Inqf+pi8AGfSAU6l0wsUXxAiEAzpT8X8JRWSBL9sJtPySMjHEDm5tFNyGYJ9KKfiCz6eMCIQCgK4iYJLHU34cblYR37gXSDubXNIJMaeEmmCp6MDsdtQIhAJOuWHkQjl0bxJKETdsdAskHpd+g8atG/eJCFjWypUunAiADd83WVX0QOeLIAx3CJwIzQSVYZYeoteYtGsBYsvCkvQIhAIPY48I8N7iSIi3IkZqnhvdSyfKu2M3cQ06d+mjUxhMa"

linux脚本,公钥中不要有换行和空格:

java -cp ".:druid-1.2.9.jar" DruidPasswordEncryptor "MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAgUA+/Cmtp7x249IQqFwe9iLFnOukbDfHWJEcyro+1Cc83kg3eYL1fyxkoGGfCijNqMxxzCuRIRs9pC5g+AQUfwIDAQABAkBL5sSWJIucEyrmQrgRhneQJ39Q1XirLF5efmkgDBtVThYqmDw+9dbbzEJr03uvg6Inqf+pi8AGfSAU6l0wsUXxAiEAzpT8X8JRWSBL9sJtPySMjHEDm5tFNyGYJ9KKfiCz6eMCIQCgK4iYJLHU34cblYR37gXSDubXNIJMaeEmmCp6MDsdtQIhAJOuWHkQjl0bxJKETdsdAskHpd+g8atG/eJCFjWypUunAiADd83WVX0QOeLIAx3CJwIzQSVYZYeoteYtGsBYsvCkvQIhAIPY48I8N7iSIi3IkZqnhvdSyfKu2M3cQ06d+mjUxhMa"

效果图:

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐