news 2026/5/8 21:11:31

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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. 符合等保、密评、国产化要求。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 21:10:45

OBBDetection环境配置步骤

本文仅涉及OBBDetection的环境配置&#xff0c;因为我要复现Oriented R-CNN for Object Detection&#xff0c;具体怎样训练自己的数据集网上有好多攻略… 我对OBBDetection环境进行配置的时候出现了很多错误&#xff0c;导致一直配不成功&#xff0c;看了别的大佬的解决办法也…

作者头像 李华
网站建设 2026/5/8 21:04:20

Stackmoss:构建生产级AI原生应用的一体化框架实战指南

1. 项目概述与核心价值最近在开源社区里&#xff0c;Stackmoss 这个项目引起了我的注意。它不是一个简单的工具库&#xff0c;而是一个旨在构建“AI原生应用”的完整技术栈。简单来说&#xff0c;它想解决的问题是&#xff1a;当你想开发一个真正由AI驱动、而非仅仅调用API的应…

作者头像 李华
网站建设 2026/5/8 21:03:35

从无人机到3D打印机:2804电机参数测量背后的FOC控制实战意义

从无人机到3D打印机&#xff1a;2804电机参数测量背后的FOC控制实战意义 在穿越机竞速比赛中&#xff0c;0.1秒的响应延迟可能导致撞杆&#xff1b;在高精度3D打印中&#xff0c;5%的扭矩波动会留下可见的层纹&#xff1b;当小型机器人关节驱动出现10的位置误差时&#xff0c;抓…

作者头像 李华
网站建设 2026/5/8 21:02:29

IE项目迁移Chrome避坑指南:不只是ActiveXObject,这些API也要小心

IE项目迁移Chrome避坑指南&#xff1a;不只是ActiveXObject&#xff0c;这些API也要小心 当企业决定将老旧Web系统从IE迁移到Chrome时&#xff0c;技术团队往往会发现ActiveXObject报错只是冰山一角。实际上&#xff0c;IE特有的API和行为差异遍布整个代码库&#xff0c;从事件…

作者头像 李华