org.springframework.boot.env.EnvironmentPostProcessor是一个"环境后处理器",让你有机会在应用启动的早期阶段,动态地添加、修改或删除环境中的属性(Properties),比如来自配置文件 (application.yml)、系统属性、命令行参数等的值。
一、创建一个类实现 EnvironmentPostProcessor 接口
java
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.AES;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.EnumerablePropertySource;
import org.springframework.core.env.MapPropertySource;
import org.springframework.core.env.PropertySource;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* 系统环境后置处理器
*/
@Slf4j
public class DecryptEnvPostProcessor implements EnvironmentPostProcessor {
private static final Set<String> ENCRYPTED_KEYS = Set.of(
"spring.datasource.password"
);
private static final AES aes = SecureUtil.aes("Encrypt-20251106".getBytes());
@Override
public void postProcessEnvironment(ConfigurableEnvironment env, SpringApplication application) {
Map<String, Object> decryptedValues = new HashMap<>();
for (PropertySource<?> source : env.getPropertySources()) {
if (!(source instanceof EnumerablePropertySource<?> eps)) {
continue;
}
for (String keyName : eps.getPropertyNames()) {
if (!ENCRYPTED_KEYS.contains(keyName)) {
continue;
}
Object value = eps.getProperty(keyName);
if (!(value instanceof String strValue)) {
continue;
}
//判断是否为加密值(用ENC()包裹)
if (!strValue.startsWith("ENC(") || !strValue.endsWith(")")) {
continue;
}
String cipherText = strValue.substring(4, strValue.length() - 1);
try {
//解密
String plainText = aes.decryptStr(cipherText);
decryptedValues.put(keyName, plainText);
} catch (Exception e) {
log.error("解密配置项 [" + keyName + "] 失败,保持原密文: " + e.getMessage());
}
}
}
//将解密后的值添加到最高优先级的PropertySource中
if (!decryptedValues.isEmpty()) {
MapPropertySource decryptedPropertySource = new MapPropertySource("decryptedProperties", decryptedValues);
env.getPropertySources().addFirst(decryptedPropertySource);
}
}
}
二、在 src/main/resources/META-INF/spring.factories 文件中进行声明

java
org.springframework.boot.env.EnvironmentPostProcessor=com.**.config.DecryptEnvPostProcessor
三、生成密码
java
@Test
public void test() {
AES aes = SecureUtil.aes("Encrypt-20251106".getBytes());
//加密
String encryptHex = aes.encryptHex("123456");
log.info("加密后 (Hex): " + encryptHex);
//解密
String decryptStr = aes.decryptStr(encryptHex);
log.info("解密后: " + decryptStr);
}

四、在配置文件中应用
