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 项目集成建议
-
封装成 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); } } }
-
加密敏感字段(如手机号)存数据库
-
接口入参加密 + 出参解密(前后端配合)
-
支持注解方式自动加解密(可选扩展)
可选增强
- 支持 SM4 CBC 模式(需要 IV 向量)
- 密钥统一管理(建议结合加密配置中心)
- 加密数据进行 Base64 编码(便于传输)
- 使用 Sa-Token + SM4 实现 Token 加密