Spring Boot 数据库明文密码加密

1. 引入依赖

在项目的 pom.xml 文件中引入以下依赖,用于支持 Jasypt 加密功能:

<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>3.0.4</version>
</dependency>

2.  在配置文件中添加Jasypt配置

application.ymlapplication.properties 中添加以下配置:

jasypt:
    encryptor:
        # 加密器的密码,用于解密配置文件中的加密内容。
        # 请确保此密码足够复杂且妥善保管,避免泄露。
        password: hduOJTi0Y4kLNO8EQ/DCWA==

        # 加密算法,使用PBEWithMD5AndDES算法对数据进行加密和解密。
        # 可根据需要更换为其他支持的加密算法。
        algorithm: PBEWithMD5AndDES

        # 配置初始化向量生成器,解决Jasypt 3.0.3及以上版本启动报错的问题。
        # NoIvGenerator表示不使用向量生成器(即无向量)。
        iv-generator-classname: org.jasypt.iv.NoIvGenerator

3. 创建加密密码生成类

编写一个工具类,用于将明文密码加密成密文:

import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;

/**
 * 加密密码生成工具类
 * @author Gurucyy
 */
public class PasswordEncryptor {
    public static void main(String[] args) {
        // 明文密码
        String password = "tHMfKlK6H4VXH#!r%%9m";
        // 加密秘钥,与配置文件中的 jasypt.encryptor.password 保持一致
        String secretKey = "hduOJTi0Y4kLNO8EQ/DCWA==";
        // 加密算法,与配置文件中的 jasypt.encryptor.algorithm 保持一致
        String algorithm = "PBEWithMD5AndDES";

        // 创建加密器对象
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        encryptor.setPassword(secretKey);
        encryptor.setAlgorithm(algorithm);

        // 执行加密操作
        String encryptedPassword = encryptor.encrypt(password);
        System.out.println("最终生成的加密串:" + encryptedPassword);
    }
}

4. 替换配置文件中的明文密码

将配置文件中的明文密码替换为加密后的密文。例如:

# 原始配置(明文密码)
datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: tHMfKlK6H4VXH#!r%%9m

# 修改后的配置(加密密码)
datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: ENC(NW9H3xDZNC1zL/QKDJd8Ew==) # 这里的内容是生成的加密串

 5. 重启Java项目,验证配置文件中加密内容的解密功能是否正常工作。

注意事项:

  • jasypt.encryptor.passwordjasypt.encryptor.algorithm 在生成加密串时必须与配置文件中保持一致。
  • 替换后的密码需要使用 ENC() 包裹,以便Jasypt在启动时自动解密。
  • 如果需要更换加密算法或秘钥,请同时更新工具类和配置文件中的相关配置。
<think>好的,我现在需要在Spring Boot 3项目中集成Spring Dynamic并实现数据库密码加密。用户提到的引用资料中有一些线索,我需要仔细分析这些信息,然后找到正确的配置方法。 首先,根据引用[2],用户名和密码通常保存在spring.datasource.username和spring.datasource.password中,而数据源配置不需要再重复设置。但这里的问题是如何加密这些密码。引用[3]提到历史数据加密和新增数据加密的问题,可能需要透明化的处理方式,这提示我需要使用某种中间件或框架来拦截并加解密数据库密码。 然后,引用[4]提到连接池的配置,Dynamic Datasource可能是一个动态数据源管理工具,可能需要结合它来实现密码的动态解密。ShardingSphere在引用[1]中被提到用于数据加密和数据脱敏,这可能是一个可行的方案,但用户的问题是关于集成Spring Dynamic,可能需要先明确Spring Dynamic是否指的是Spring Dynamic DataSource,或者是另一个库。 现在,我需要确认Spring Boot 3是否支持现有的加密库,比如Jasypt或者Spring Cloud Vault。但用户可能希望使用Spring Dynamic Datasource结合某种加密机制。例如,可能需要在数据源配置时,动态地从加密的配置中读取密码,并在运行时解密。 可能的步骤包括: 1. 引入依赖,比如Spring Dynamic Datasource和加密工具(如Jasypt)。 2. 配置加密后的密码在application.properties中,使用加密后的字符串。 3. 自定义数据源配置,在创建数据源时解密密码。 例如,使用Jasypt来加密密码,然后在配置文件中使用ENC(加密后的字符串),并在运行时通过Jasypt自动解密。同时,结合Dynamic Datasource来管理多个数据源的情况,确保每个数据源的密码都能正确解密。 需要验证配置是否正确,确保解密后的密码能够正确连接到数据库。另外,引用[3]提到的历史数据迁移可能需要更复杂的处理,但当前问题可能只需要处理配置阶段的加密。 可能的问题是如何在Dynamic Datasource中集成解密逻辑。例如,自定义DataSourceCreator,在创建数据源时对加密密码进行解密。这可能需要实现一个BeanPostProcessor或者自定义的DataSource配置类。 另外,需要考虑加密密钥的安全存储,比如使用环境变量或密钥管理服务,避免将密钥硬编码在配置文件中。 最后,根据最佳实践,应该将加密配置和密钥管理结合起来,确保安全性和可维护性。可能需要查阅Spring Dynamic Datasource的文档,看看是否支持自定义属性解析,或者是否有扩展点可以插入解密逻辑。</think>在Spring Boot 3中实现动态数据库密码加密,可通过集成`Spring Dynamic Datasource`与加密工具(如Jasypt)实现透明化加解密。以下是分步配置方案: --- ### 一、依赖引入 1. **Spring Dynamic Datasource**:用于动态数据源管理 2. **Jasypt**:用于配置文件加密 ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>4.2.0</version> </dependency> <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.5</version> </dependency> ``` --- ### 二、加密配置 1. **生成加密密码**:使用Jasypt命令行工具加密原始密码 ```bash java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI \ input="your_db_password" password="your_encryption_key" algorithm="PBEWITHHMACSHA512ANDAES_256" ``` 输出结果为`ENC(加密后字符串)`,例如:`ENC(abxT2FjG4Vlkj...)` 2. **配置`application.yml`**:替换明文密码加密值 ```yaml spring: datasource: dynamic: primary: master datasource: master: url: jdbc:mysql://localhost:3306/db username: ENC(加密后用户名) password: ENC(加密密码) driver-class-name: com.mysql.cj.jdbc.Driver ``` --- ### 三、密钥安全管理 通过环境变量或启动参数传递加密密钥,**避免硬编码**: ```bash java -jar your-app.jar -Djasypt.encryptor.password=your_encryption_key ``` --- ### 四、动态数据源集成 1. **自定义数据源工厂**:在创建数据源时自动解密密码 ```java @Configuration public class DataSourceConfig { @Autowired private StringEncryptor jasyptEncryptor; @Bean public DataSourceCreator dataSourceCreator() { return new DataSourceCreator() { @Override public DataSource createDataSource(DataSourceProperty property) { property.setUsername(jasyptEncryptor.decrypt(property.getUsername())); property.setPassword(jasyptEncryptor.decrypt(property.getPassword())); return super.createDataSource(property); } }; } } ``` --- ### 五、验证与测试 1. 启动应用时检查数据库连接是否成功 2. 通过`/actuator/health`端点验证数据源状态 3. 使用日志检查解密过程是否生效 --- ### 最佳实践 1. **密钥轮换**:定期更新加密密钥,结合Vault等密钥管理工具[^2] 2. **敏感操作审计**:记录密码解密和数据库连接事件 3. **多环境隔离**:不同环境使用独立密钥,通过Profile区分配置[^4] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值