随着国家信息安全战略的深入推进,国产密码算法("国密")在政务、金融、电信等关键领域的应用越来越广泛。
RuoYi-SpringBoot3-Pro[1]
内置了完整的国密算法支持,帮助开发者快速构建符合等保密评要求的应用系统。
国密算法是由国家密码管理局制定的一系列密码标准,主要包括:
| 算法 | 类型 | 说明 |
|---|---|---|
| SM2 | 非对称加密 | 基于椭圆曲线的公钥密码算法,用于数字签名、密钥交换和数据加密 |
| SM3 | 杂凑算法 | 类似于 SHA-256,用于数据完整性校验和数字签名 |
| SM4 | 对称加密 | 分组密码算法,密钥长度 128 位,类似于 AES |
前端使用 sm-crypto[2] 库,这是一个纯 JavaScript 实现的国密算法库。
安装依赖:
npm install --save sm-crypto
核心代码实现:
import smCrypto from "sm-crypto";
const sm2 = smCrypto.sm2;
const cipherMode = 1;
const publicKey = "";
export default {
// SM2加密
doSm2Encrypt(msgString) {
return sm2.doEncrypt(msgString, publicKey, cipherMode);
},
};
Important
前端只保存公钥,私钥保存在后端,确保密钥安全。
后端使用 antherd/sm-crypto[3] 库,这是基于 JavaScript 版本封装的 Java 实现,能够与前端无缝兼容。
Maven 依赖:
<dependency>
<groupId>com.antherd</groupId>
<artifactId>sm-crypto</artifactId>
<version>0.3.2.1</version>
</dependency>
核心工具类:
public class SmCryptoUtils {
/** 公钥 */
private static final String PUBLIC_KEY = "";
/** 私钥 */
private static final String PRIVATE_KEY = "";
/** SM4对称秘钥 */
private static final String KEY = "";
// SM2 加密
public static String doSm2Encrypt(String str) {
return sm2.encryptHex(str, KeyType.PublicKey);
}
// SM2 解密
public static String doSm2Decrypt(String str) {
return sm2.decryptStr(str, KeyType.PrivateKey);
}
// SM4 CBC模式加密
public static String doSm4CbcEncrypt(String str) {
Sm4Options sm4Options = new Sm4Options();
sm4Options.setMode("cbc");
sm4Options.setIv("");
return Sm4.encrypt(str, KEY, sm4Options);
}
// SM3 杂凑
public static String doHashValue(String str) {
return SmUtil.sm3(str);
}
// 签名
public static String doSignature(String str) {
return HexUtil.encodeHexStr(sm2.sign(StrUtil.utf8Bytes(str)));
}
// 验签
public static boolean doVerifySignature(String originalStr, String str) {
return sm2.verify(StrUtil.utf8Bytes(originalStr), HexUtil.decodeHex(str));
}
}
用户输入密码后,前端使用 SM2 公钥加密,后端使用私钥解密:
用户输入密码 → 前端SM2加密 → 传输密文 → 后端SM2解密 → 验证密码
使用 SM4 对称加密存储敏感数据:
明文数据 → SM4加密 → 存储密文 → SM4解密 → 获取明文
使用 SM3 生成数据摘要,验证数据是否被篡改:
原始数据 → SM3杂凑 → 生成摘要 → 比对校验
使用 SM2 进行签名验签,保证数据来源可信:
数据 + 私钥 → SM2签名 → 公钥验签 → 确认身份
Caution
生产环境必须重新生成密钥对,切勿使用示例中的默认密钥!
生成密钥对(JavaScript):
const sm2 = require("sm-crypto").sm2;
let keypair = sm2.generateKeyPairHex();
console.log("公钥:", keypair.publicKey);
console.log("私钥:", keypair.privateKey);
生成密钥对(Java):
Keypair keypair = Sm2.generateKeyPairHex();
String publicKey = keypair.getPublicKey();
String privateKey = keypair.getPrivateKey();
如果项目需要通过等保密评,需注意以下事项:
RuoYi-SpringBoot3-Pro
通过集成成熟的国密算法库,为开发者提供了开箱即用的国产化加密方案。前端使用
sm-crypto 进行公钥加密,后端使用
antherd/sm-crypto 和
Hutool
进行解密和签名验证,两者密钥格式完全兼容,实现了前后端无缝对接。
在实际项目中,开发者只需:
即可快速完成国密算法的集成,满足国产化改造和等保密评的安全要求。
[1]
RuoYi-SpringBoot3-Pro:
https://github.com/undsky/RuoYi-SpringBoot3-Pro
[2] sm-crypto:
https://github.com/JuneAndGreen/sm-crypto
[3]
antherd/sm-crypto:
https://github.com/antherd/sm-crypto