配置加密
MyBatis-Plus 支持配置加密
cnadmin 基于 MyBatis-Plus ORM 框架,MyBatis-Plus 允许你使用加密后的字符串来配置数据库连接等信息。在配置文件中,以 mpw: 开头的配置项将被视为加密内容。
yaml
spring:
datasource:
url: mpw:qRhvCwF4GOqjessEB3G+a5okP+uXXr96wcucn2Pev6Bf1oEMZ1gVpPPhdDmjQqoM
password: mpw:Hzy5iliJbwDHhjLs1L0j6w==
username: mpw:Xb+EgsyuYRXw7U7sBJjBpA==密钥加密
使用 AES 算法生成随机密钥,并对敏感数据进行加密。
java
// 生成16位随机AES密钥
String randomKey = AES.generateRandomKey();
// 使用随机密钥加密数据
String encryptedData = AES.encrypt(data, randomKey);使用方式
在启动应用程序时,通过命令行参数。
自 MyBatis-Plus v3.5.10 开始支持系统属性与环境变量传递密钥。
bash
// Jar 启动参数示例(在 IDEA 中设置 Program arguments,或在服务器上设置为启动环境变量)
--mpw.key=d1104d7c3b616f0b基于 Jasypt
Jasypt(Java Simplified Encryption)
Jasypt 是一个专注于简化加密操作的 Java 库。它能让开发者以简单的方式为项目添加基本的加密功能,而无需深入理解底层复杂的加密原理。
常用应用场景:配置文件敏感信息加密(如数据库密码)、数据存储与传输加密等。
引入依赖
xml
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>配置
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使用方式
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-配置加密