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 加密

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思静鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值