Skip to content

配置加密

最后更新: 13 小时前
实践版本: v4.1.0

MyBatis-Plus 支持配置加密

cnadmin 基于 MyBatis-Plus ORM 框架,MyBatis-Plus 允许你使用加密后的字符串来配置数据库连接等信息。在配置文件中,以 mpw: 开头的配置项将被视为加密内容。

MP 官方文档示例
yaml
spring:
  datasource:
    url: mpw:qRhvCwF4GOqjessEB3G+a5okP+uXXr96wcucn2Pev6Bf1oEMZ1gVpPPhdDmjQqoM
    password: mpw:Hzy5iliJbwDHhjLs1L0j6w==
    username: mpw:Xb+EgsyuYRXw7U7sBJjBpA==

密钥加密

使用 AES 算法生成随机密钥,并对敏感数据进行加密。

MP 官方文档示例
java
// 生成16位随机AES密钥
String randomKey = AES.generateRandomKey();

// 使用随机密钥加密数据
String encryptedData = AES.encrypt(data, randomKey);

使用方式

在启动应用程序时,通过命令行参数。

自 MyBatis-Plus v3.5.10 开始支持系统属性与环境变量传递密钥。

MP 官方文档示例
bash
// Jar 启动参数示例(在 IDEA 中设置 Program arguments,或在服务器上设置为启动环境变量)
--mpw.key=d1104d7c3b616f0b

基于 Jasypt

Jasypt(Java Simplified Encryption)

Jasypt 是一个专注于简化加密操作的 Java 库。它能让开发者以简单的方式为项目添加基本的加密功能,而无需深入理解底层复杂的加密原理。

常用应用场景:配置文件敏感信息加密(如数据库密码)、数据存储与传输加密等。

引入依赖

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

配置

application.yml
yaml
jasypt:
  encryptor:
    iv-generator-classname: org.jasypt.iv.RandomIvGenerator
    # 加密算法
    algorithm: PBEWITHHMACSHA512ANDAES_256
    # 加密秘钥(自行配置好环境变量)
    password: ${JASYPT_PASSWORD}
    property:
      # 算法识别的前后缀,默认 ENC(),例如:ENC(加密后的字符串)
      prefix: ENC(
      suffix: )

密钥加密

使用 API 或 jasypt jar 直接加密数据。

bash
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI algorithm=PBEWITHHMACSHA512ANDAES_256 ivGeneratorClassName=org.jasypt.iv.RandomIvGenerator password="加密密钥" input="要加密的内容"
bash
----ENVIRONMENT-----------------

Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 17.0.9+11-LTS-201



----ARGUMENTS-------------------

input: root123
password: charles
ivGeneratorClassName: org.jasypt.iv.RandomIvGenerator
algorithm: PBEWITHHMACSHA512ANDAES_256



----OUTPUT----------------------

lv+Dp/H+yDOvDxBGjaHtT7qOqwtfXv6JVxtQDTaKohuQsKEBMqy+Opc9UD+llCdl

使用方式

application.yml
yaml
spring:
  datasource:
    username: ENC(加密内容)
    password: ENC(加密内容)

自行实现

自行实现 EnvironmentPostProcessor 接口,在启动时,将解密后的数据放入环境变量中,并作为优先级最高的配置源。

java
public class DecryptEnvironmentProcessor implements EnvironmentPostProcessor {

    private static final String ENCRYPT_PREFIX = "{encrypt}";

    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        Map<String, Object> map = MapUtil.newHashMap();
        // 获取所有配置源, 按优先级排序
        for (PropertySource<?> propertySource : environment.getPropertySources()) {
            if (propertySource instanceof OriginTrackedMapPropertySource ps) {
                this.decrypt(ps, map);
            }
        }
        // 将解密的数据放入环境变量,并处于第一优先级上
        if (CollUtil.isNotEmpty(map)) {
            environment.getPropertySources().addFirst(new MapPropertySource("custom-encrypt", map));
        }
    }

    /**
     * 解密
     *
     * @param propertySource 配置源
     * @param decryptMap     解密后的数据
     */
    private void decrypt(OriginTrackedMapPropertySource propertySource, Map<String, Object> decryptMap) {
        for (String name : propertySource.getPropertyNames()) {
            Object value = propertySource.getProperty(name);
            if (value instanceof String str) {
                if (str.startsWith(ENCRYPT_PREFIX)) {
                    // 你的解密逻辑
                    String decryptValue = XxxUtil.decrypt(str.replace(ENCRYPT_PREFIX, ""));
                    decryptMap.put(name, decryptValue);
                } else {
                    // 默认不加密,将原值存储进去,覆盖原有参数
                    decryptMap.put(name, value);
                }
            }
        }
    }
}

参考资料

1.YML 配置加密 | MyBatis-Plus:https://baomidou.com/guides/security/#yml-配置加密