【RuoYi-SpringBoot3-Pro】:国产化改造-国密算法

随着国家信息安全战略的深入推进,国产密码算法("国密")在政务、金融、电信等关键领域的应用越来越广泛。
RuoYi-SpringBoot3-Pro[1] 内置了完整的国密算法支持,帮助开发者快速构建符合等保密评要求的应用系统。

国密算法简介

国密算法是由国家密码管理局制定的一系列密码标准,主要包括:

算法 类型 说明
SM2 非对称加密 基于椭圆曲线的公钥密码算法,用于数字签名、密钥交换和数据加密
SM3 杂凑算法 类似于 SHA-256,用于数据完整性校验和数字签名
SM4 对称加密 分组密码算法,密钥长度 128 位,类似于 AES

技术实现

前端实现(JavaScript)

前端使用 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

前端只保存公钥,私钥保存在后端,确保密钥安全。

后端实现(Java)

后端使用 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));
    }
}

应用场景

1. 登录密码加密

用户输入密码后,前端使用 SM2 公钥加密,后端使用私钥解密:


    
    
    
  用户输入密码 → 前端SM2加密 → 传输密文 → 后端SM2解密 → 验证密码

2. 敏感数据存储

使用 SM4 对称加密存储敏感数据:


    
    
    
  明文数据 → SM4加密 → 存储密文 → SM4解密 → 获取明文

3. 数据完整性校验

使用 SM3 生成数据摘要,验证数据是否被篡改:


    
    
    
  原始数据 → SM3杂凑 → 生成摘要 → 比对校验

4. 数字签名

使用 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();

等保密评要求

如果项目需要通过等保密评,需注意以下事项:

  1. 1. 更换密钥:使用自行生成的公私钥对
  2. 2. 加密机集成:如需更高安全级别,可接入硬件加密机
  3. 3. 密钥存储:私钥不应明文存储在代码中,建议使用配置中心或密钥管理服务
  4. 4. 传输安全:配合 HTTPS 确保传输层安全

RuoYi-SpringBoot3-Pro 通过集成成熟的国密算法库,为开发者提供了开箱即用的国产化加密方案。前端使用 sm-crypto 进行公钥加密,后端使用 antherd/sm-cryptoHutool 进行解密和签名验证,两者密钥格式完全兼容,实现了前后端无缝对接。

在实际项目中,开发者只需:

  1. 1. 生成自己的密钥对
  2. 2. 配置到前后端代码中
  3. 3. 调用封装好的工具类方法

即可快速完成国密算法的集成,满足国产化改造和等保密评的安全要求。

往期教程合集

RuoYi-SpringBoot3-Pro


引用链接

[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