SpringBoot 国密 SM4 配置加密自动解密处理器实现前言一、核心依赖二、工具类ApplicationConfigUtilsSm4Utils三、自动解密处理器Sm4EncryptProcessor四、Spring 自动注册1. 创建文件2. 文件内容五、YML 配置文件application.yml六、测试 Value 直接注入明文七、运行结果八、问题解决九、总结前言上一篇实现了工具类加解密方法本篇基于国密 SM4 算法实现 SpringBoot 环境自动解密处理器完全贴合 SpringBoot 原生用法满足等保、密评、国产化合规要求。使用方式启动自动解密SpringBoot 启动时自动扫描 ENC(xxx) 并解密原生注解使用Value / ConfigurationProperties 直接注入明文无侵入业务代码无需修改只加解密组件国密合规SM4 对称加密满足生产环境安全规范。一、核心依赖项目依赖 Hutool 国密工具包 BouncyCastle 加密库!-- Hutool 国密加密SM4 --dependencygroupIdcn.hutool/groupIdartifactIdhutool-crypto/artifactIdversion5.8.20/version/dependency!-- BouncyCastle 密码学提供方 --dependencygroupIdorg.bouncycastle/groupIdartifactIdbcprov-jdk15on/artifactIdversion1.70/version/dependency二、工具类ApplicationConfigUtilsSm4Utils上一篇博文的工具类跳转入口如下SpringBoot 国密 SM4 配置加密工具类实现三、自动解密处理器Sm4EncryptProcessorimportcom.learn.utils.Sm4Utils;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.env.EnvironmentPostProcessor;importorg.springframework.core.env.ConfigurableEnvironment;importorg.springframework.core.env.MapPropertySource;importorg.springframework.core.env.PropertySource;importjava.util.HashMap;importjava.util.Map;/** * SpringBoot 配置文件自动解密处理器 * 项目启动时会自动解密 ENC(xxx) 格式的配置 * */publicclassSm4EncryptProcessorimplementsEnvironmentPostProcessor{/** * 加密标识前缀和ApplicationConfigUtils保持一致 */privatestaticfinalStringPREFIXENC(;/** * 加密标识后缀和ApplicationConfigUtils保持一致 */privatestaticfinalStringSUFFIX);/** * 存放解密后的配置 */privatefinalMapString,ObjectdecryptMapnewHashMap();/** * SpringBoot环境初始化时执行自动解密配置 * param environment Spring环境对象存储所有配置 * param application SpringBoot应用对象 */OverridepublicvoidpostProcessEnvironment(ConfigurableEnvironmentenvironment,SpringApplicationapplication){// 遍历SpringBoot所有配置源for(PropertySource?ps:environment.getPropertySources()){// 只处理我们自己写的 application.yml/properties 配置Stringnameps.getName();if(name.contains(application)name.contains(.yml)||name.contains(.properties)){Objectsourceps.getSource();if(sourceinstanceofMap){MapString,Objectmap(MapString,Object)source;// 遍历所有配置项识别并解密ENC格式的配置for(Map.EntryString,Objectentry:map.entrySet()){ObjectvalueObjentry.getValue();StringvalueString.valueOf(valueObj);// 判断是否是加密格式ENC(xxx)if(value.startsWith(PREFIX)value.endsWith(SUFFIX)){// 截取加密串去掉ENC()标识StringencryptStrvalue.substring(PREFIX.length(),value.length()-SUFFIX.length());// 调用SM4工具类解密StringdecryptStrSm4Utils.decrypt(encryptStr);// 存入解密集合decryptMap.put(entry.getKey(),decryptStr);}}}}}if(!decryptMap.isEmpty()){environment.getPropertySources().addFirst(newMapPropertySource(sm4-decrypt-source,decryptMap));}}}四、Spring 自动注册注册解密处理器让SpringBoot启动时识别并执行自动解密逻辑只需要创建一个文件即可。1. 创建文件在 resources/META-INF/ 目录下创建 spring.factories 文件。2. 文件内容注册解密处理器替换成自己的包路径核心配置org.springframework.boot.env.EnvironmentPostProcessorcom.你的包名.Sm4EncryptProcessor五、YML 配置文件application.yml密钥规则SM4 密钥必须是 16 位字符数字 / 字母均可生产环境严禁硬编码在配置文件建议放到 Nacos/Apollo/ 密钥管理系统。加密格式固定ENC(SM4 加密后的密文)#国密SM4配置sm4:key:1234567890123456# 必须16位测试使用生产环境请放配置中心 #测试加密配置## 单层配置 testPassword:ENC(1bb11e4cf9eebd2538d53ebcaacb9cfe)## 多层配置 test:password:ENC(1bb11e4cf9eebd2538d53ebcaacb9cfe)六、测试 Value 直接注入明文RestControllerpublicclassTestController{// 直接获取解密后的密码Value(${test.password})privateStringtestPass;Operation(summary项目运行后接口获取已加密的数据)GetMapping(test)publicStringtestSm4(){System.out.println(Value方式获取配置信息[多层]:testPass);Stringproperty0ApplicationConfigUtils.getProperty(sm4.key);System.out.println(sm4.key数据[多层]:property0);Stringproperty1ApplicationConfigUtils.getProperty(testPassword);Stringproperty2ApplicationConfigUtils.getProperty(test.password);System.out.println(testPassword数据[单层]:property1);System.out.println(test.password数据[多层]:property2);returnproperty1;}}七、运行结果Value方式获取配置信息[多层]:123456sm4.key数据[多层]:1234567890123456testPassword数据[单层]:123456test.password数据[多层]:123456八、问题解决解密不生效 / Value 拿到的还是密文解决方案检查 EnvironmentPostProcessor 文件路径是否正确检查全类名是否正确检查配置是否以 ENC( 开头、) 结尾无空格。密钥非法报错解决方案SM4 密钥必须 16 位字符不能多也不能少。多模块项目找不到配置文件原因application.yml文件不存在或路径错误 。解决方案确保 application.yml 放在 启动模块的 resources 下或者在pom.xml中配置build。空指针异常解决方案检查密文是否正确检查 Sm4Utils 密钥是否与加密时一致检查配置项名称是否写错。九、总结本篇实现了企业级 SpringBoot 国密 SM4 自动解密方案启动自动解密无侵入Value 直接获取原文符合等保、密评、国产化要求。