当前位置: 首页 > news >正文

SpringBoot 国密 SM4 配置加密(自动解密处理器实现)

SpringBoot 国密 SM4 配置加密(自动解密处理器实现)

    • 前言
    • 一、核心依赖
    • 二、工具类(ApplicationConfigUtils,Sm4Utils)
    • 三、自动解密处理器(Sm4EncryptProcessor)
    • 四、Spring 自动注册
      • 1. 创建文件
      • 2. 文件内容
    • 五、YML 配置文件(application.yml)
    • 六、测试 @Value 直接注入明文
    • 七、运行结果
    • 八、问题解决
    • 九、总结

前言

上一篇实现了工具类加解密方法,本篇基于国密 SM4 算法,实现 SpringBoot 环境自动解密处理器,完全贴合 SpringBoot 原生用法,满足等保、密评、国产化合规要求。使用方式:

  1. 启动自动解密:SpringBoot 启动时自动扫描 ENC(xxx) 并解密;
  2. 原生注解使用:@Value / @ConfigurationProperties 直接注入明文;
  3. 无侵入:业务代码无需修改,只加解密组件;
  4. 国密合规:SM4 对称加密,满足生产环境安全规范。

一、核心依赖

项目依赖 Hutool 国密工具包 + BouncyCastle 加密库:

<!-- Hutool 国密加密(SM4) --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-crypto</artifactId><version>5.8.20</version></dependency><!-- BouncyCastle 密码学提供方 --><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.70</version></dependency>

二、工具类(ApplicationConfigUtils,Sm4Utils)

上一篇博文的工具类,跳转入口如下:
SpringBoot 国密 SM4 配置加密(工具类实现)

三、自动解密处理器(Sm4EncryptProcessor)

importcom.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保持一致) */privatestaticfinalStringPREFIX="ENC(";/** * 加密标识后缀(和ApplicationConfigUtils保持一致) */privatestaticfinalStringSUFFIX=")";/** * 存放解密后的配置 */privatefinalMap<String,Object>decryptMap=newHashMap<>();/** * SpringBoot环境初始化时执行,自动解密配置 * @param environment Spring环境对象(存储所有配置) * @param application SpringBoot应用对象 */@OverridepublicvoidpostProcessEnvironment(ConfigurableEnvironmentenvironment,SpringApplicationapplication){// 遍历SpringBoot所有配置源for(PropertySource<?>ps:environment.getPropertySources()){// 只处理我们自己写的 application.yml/properties 配置Stringname=ps.getName();if(name.contains("application")&&name.contains(".yml")||name.contains(".properties")){Objectsource=ps.getSource();if(sourceinstanceofMap){Map<String,Object>map=(Map<String,Object>)source;// 遍历所有配置项,识别并解密ENC格式的配置for(Map.Entry<String,Object>entry:map.entrySet()){ObjectvalueObj=entry.getValue();Stringvalue=String.valueOf(valueObj);// 判断是否是加密格式(ENC(xxx))if(value.startsWith(PREFIX)&&value.endsWith(SUFFIX)){// 截取加密串(去掉ENC()标识)StringencryptStr=value.substring(PREFIX.length(),value.length()-SUFFIX.length());// 调用SM4工具类解密StringdecryptStr=Sm4Utils.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.EnvironmentPostProcessor=com.你的包名.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);Stringproperty0=ApplicationConfigUtils.getProperty("sm4.key");System.out.println("sm4.key数据[多层]:"+property0);Stringproperty1=ApplicationConfigUtils.getProperty("testPassword");Stringproperty2=ApplicationConfigUtils.getProperty("test.password");System.out.println("testPassword数据[单层]:"+property1);System.out.println("test.password数据[多层]:"+property2);returnproperty1;}}

七、运行结果

@Value方式获取配置信息[多层]:123456sm4.key数据[多层]:1234567890123456testPassword数据[单层]:123456test.password数据[多层]:123456

八、问题解决

  1. 解密不生效 / @Value 拿到的还是密文
    解决方案:检查 EnvironmentPostProcessor 文件路径是否正确;检查全类名是否正确;检查配置是否以 ENC( 开头、) 结尾,无空格。
  2. 密钥非法报错
    解决方案:SM4 密钥必须 16 位字符,不能多也不能少。
  3. 多模块项目找不到配置文件
    原因:application.yml文件不存在或路径错误 。解决方案:确保 application.yml 放在 启动模块的 resources 下;或者在pom.xml中配置build。
  4. 空指针异常
    解决方案:检查密文是否正确;检查 Sm4Utils 密钥是否与加密时一致;检查配置项名称是否写错。

九、总结

本篇实现了企业级 SpringBoot 国密 SM4 自动解密方案:

  1. 启动自动解密,无侵入;
  2. @Value 直接获取原文;
  3. 符合等保、密评、国产化要求。
http://www.jsqmd.com/news/778909/

相关文章:

  • 创业7年,从树莓派外壳到自研电子秤,一个硬件工程师的“断臂求生”复盘
  • Budi:本地优先的AI编码助手成本分析工具,精准追踪与优化开发成本
  • 团队冲刺个人任务认领
  • 别再混淆WT和WO了!图解SAP EWM仓库任务与订单的核心逻辑与配置实例
  • 别再瞎调batch_size了!PyTorch训练中GPU显存与利用率的真实关系(附MMDetection实测数据)
  • FPGA大型项目管理:模块化设计与7Circuits工具实践
  • AI搜索时代内容优化实战:GEO工具包审计与结构化数据生成指南
  • 别再问‘两个坐标点相距多远’了!用Java/JavaScript/Python三分钟搞定经纬度距离计算
  • 免费降ai率全攻略:4个手动技巧+5款降ai工具【实测好用】 - 殷念写论文
  • 告别vcanconf!Vector硬件配置新工具vHardwareManager保姆级上手教程
  • 告别Keil默认丑字体!手把手教你配置VS Code同款暗黑主题(附global.prop文件)
  • 国产化CMS选型实录:从零部署PageAdmin到麒麟系统的实战笔记
  • 别再死磕神经网络了!用Python+scikit-fuzzy手把手教你实现一个模糊恒温控制器
  • 2026三亚目的地婚礼推荐榜TOP5,每场都惊艳 - 速递信息
  • 从PasteJacker工具看剪贴板劫持:在Kali Linux上复现一次无害攻击(仅供学习)
  • 基于Ollama与FastAPI构建本地私有化语音AI助手实战指南
  • 别再手动导数据了!巧用ICC II的ECO Fusion,把PT和StarRC的活一键搞定
  • 树莓派5 NVMe SSD与2.5GbE扩展板深度评测
  • 钢卷号—钢铁制造的“数字身份证”
  • 从‘慢收敛’到‘有限时间稳定’:快速Terminal滑模在电机控制中的调参实战(含相轨迹分析)
  • FPGA流水线FFT IP核生成器:dblclockfft配置与实战指南
  • 基于vibe-core框架构建实时视频AI智能体:从技能组合到生产部署
  • 别光看理论了!手把手带你用Ubuntu 22.04 + Mellanox ConnectX-6 搞定InfiniBand网络(附性能测试)
  • 从零开始理解Cortex-M4/M7的栈指针:MSP与PSP在RTOS中的实战配置与避坑指南
  • Qdrant向量数据库与MCP协议集成:AI应用编排新范式
  • 2026濮阳正规医美整形推荐榜:这5家医院你更中意哪家? - 速递信息
  • 从靶场到实战:手把手教你用Metasploitable2复现并理解那些“著名”的CVE漏洞
  • 别再乱勾选了!Anaconda安装时这个选项千万别选(Windows/Mac通用避坑指南)
  • Jetson Xavier NX上编译OpenCV 4.5.3支持CUDA加速,保姆级避坑指南(含libjasper-dev问题解决)
  • 2026年4月建筑加固服务厂商口碑推荐,经验丰富团队开展建筑加固 - 品牌推荐师