Springboot自定义配置解密处理器
org.springframework.boot.env.EnvironmentPostProcessor是一个“环境后处理器”,让你有机会在应用启动的早期阶段,动态地添加、修改或删除环境中的属性(Properties),比如来自配置文件 (application.yml)、系统属性、命令行参数等的值。
一、创建一个类实现 EnvironmentPostProcessor 接口
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());@Overridepublic 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 文件中进行声明

org.springframework.boot.env.EnvironmentPostProcessor=com.**.config.DecryptEnvPostProcessor三、生成密码
@Testpublic 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);}
四、在配置文件中应用

