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

Spring 集成 SM4(国密对称加密)

Spring 集成 SM4(国密对称加密)算法 主要用于保护敏感数据,如身份证、手机号、密码等。

下面是完整集成步骤(含工具类 + 使用示例),采用 Java 实现(可用于 Spring Boot)。


一、依赖引入

推荐使用 BouncyCastle 国密库支持 SM4:

<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15to18</artifactId><version>1.70</version>
</dependency>

二、SM4 工具类(ECB 模式)

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.Security;
import java.util.Base64;public class SM4Util {static {// 注册 BouncyCastle 提供者Security.addProvider(new BouncyCastleProvider());}private static final String ALGORITHM_NAME = "SM4";private static final String TRANSFORMATION = "SM4/ECB/PKCS5Padding";private static final String ENCODING = "UTF-8";/*** 加密*/public static String encrypt(String plainText, String key) throws Exception {Cipher cipher = Cipher.getInstance(TRANSFORMATION, "BC");SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(ENCODING), ALGORITHM_NAME);cipher.init(Cipher.ENCRYPT_MODE, secretKey);byte[] cipherText = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));return Base64.getEncoder().encodeToString(cipherText);}/*** 解密*/public static String decrypt(String cipherTextBase64, String key) throws Exception {Cipher cipher = Cipher.getInstance(TRANSFORMATION, "BC");SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(ENCODING), ALGORITHM_NAME);cipher.init(Cipher.DECRYPT_MODE, secretKey);byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(cipherTextBase64));return new String(decrypted, StandardCharsets.UTF_8);}
}

三、密钥要求

  • SM4 密钥必须是 16 字节(128 位)
  • 不能随意长度,例如:
String key = "1234567890abcdef"; // 刚好16个字符

四、使用示例

public class TestSm4 {public static void main(String[] args) throws Exception {String key = "1234567890abcdef";String content = "国密测试数据";String encrypted = SM4Util.encrypt(content, key);System.out.println("加密后: " + encrypted);String decrypted = SM4Util.decrypt(encrypted, key);System.out.println("解密后: " + decrypted);}
}

五、Spring Boot 项目集成建议

  1. 封装成 SM4Service

    @Service
    public class SM4Service {private final String key = "your-16-byte-key";public String encrypt(String data) {try {return SM4Util.encrypt(data, key);} catch (Exception e) {throw new RuntimeException("SM4 加密失败", e);}}public String decrypt(String data) {try {return SM4Util.decrypt(data, key);} catch (Exception e) {throw new RuntimeException("SM4 解密失败", e);}}
    }
    
  2. 加密敏感字段(如手机号)存数据库

  3. 接口入参加密 + 出参解密(前后端配合)

  4. 支持注解方式自动加解密(可选扩展)


可选增强

  • 支持 SM4 CBC 模式(需要 IV 向量)
  • 密钥统一管理(建议结合加密配置中心)
  • 加密数据进行 Base64 编码(便于传输)
  • 使用 Sa-Token + SM4 实现 Token 加密

相关文章:

  • 计算机系统----软考中级软件设计师(自用学习笔记)
  • 【TDengine源码阅读】TAOS_DEF_ERROR_CODE(mod, code)
  • Babylon.js学习之路《四、Babylon.js 中的相机(Camera)与视角控制》
  • plus-uiRuoYi-Vue-Plus 基于pgSql本地运行实践
  • 20250512期:基于arcpy数据驱动的大批量规范化出图
  • 从入门到精通:Drools全攻略
  • centos9安装docker 配置docker代理
  • 阿克曼-幻宇机器人系列教程2- 机器人交互实践(Topic)
  • ubuntu部署supabase
  • flutter编译时 设置jdk版本
  • 在Java中实现Parcelable接口和Serializable接口有什么区别?
  • 工程师必读! 3 个最常被忽略的 TDR 测试关键细节与原理
  • T-BOX硬件方案深度解析:STM32与SD NAND Flash存储的完美搭配
  • 音频转文字-在线工具包及使用记录
  • 2025年PMP 学习十一 第8章 项目质量管理(8.3)
  • 分布式链路跟踪
  • qemu热迁移后内存占用突增问题
  • C++23 ranges::range_adaptor_closure:程序定义的范围适配器闭包的辅助类
  • Starrocks的主键表涉及到的MOR Delete+Insert更新策略
  • 【阿里云】阿里云 Ubuntu 服务器无法更新 systemd(Operation not permitted)的解决方法
  • 经济日报:美国滥施汽车关税损人不利己
  • 男子发寻母视频被警方批评教育,律师:发寻亲信息是正当行为
  • A股高开高走:沪指涨0.82%,创指涨2.63%,超4100股收涨
  • 专访|日本驻华大使金杉宪治:对美、对华外交必须在保持平衡的基础上稳步推进
  • 中方发布会:中美经贸高层会谈取得了实质性进展,达成了重要共识
  • 媒体谈法院就“行人相撞案”道歉:执法公正,普法莫拉开“距离”