更新记录

1.0.0(2026-07-19)

首发:国密 SM2/SM3/SM4 全套(27 API)。

  • SM2:密钥对/签名验签/公钥加解密(C1C3C2);SM3:哈希·HMAC;SM4:ECB·CBC·CTR + PKCS7
  • GM/T·GB/T 官方标准向量锚定,纯本地计算零网络
  • App-Android + H5 双端同一核心(内存型 API 全量;文件型仅 App);iOS 原生库随包就绪、适配下版本解锁

平台兼容性

uni-app x(5.14)

Chrome Safari Android iOS 鸿蒙 微信小程序
5.0 - × ×

nex-gmcrypto —— 国密 SM2 / SM3 / SM4(高性能原生)

🌐 在线演示:https://nexdemo.test.chengaofeng.cn —— 浏览器直接看真实渲染效果(48 组件 H5 门户,无需安装)

自研高性能原生国密核心(SM2 / SM3 / SM4 全内置实现),提供 uni-app 可调的 JS API。支持 App-AndroidH5 端 (双端同一核心、同真值,见下「H5 端」);iOS:原生库与绑定已随包就绪,适配下版本解锁;小程序不支持。

同一份 utssdk 插件同时支持 uni-app x(uvue)经典 uni-app(vue3),无需分叉。 期望值全部锚定 GM/T 0004-2012 / GB/T 32907-2016 官方黄金向量,绝不自造;无额外系统依赖。

API(12 个)

JS API 签名 说明
SM3 sm3Hash sm3Hash(text): string SM3 文本哈希 → 64 hex(不抛错)
sm3HashFile sm3HashFile(path): string 文件流式哈希 → 64 hex
hmacSm3 hmacSm3(text, keyHex): string HMAC-SM3 → 64 hex
SM4 sm4Encrypt sm4Encrypt(plaintext, keyHex, mode, ivHex): string → base64 密文
sm4Decrypt sm4Decrypt(ciphertextB64, keyHex, mode, ivHex): string base64 → 明文
sm4EncryptFile sm4EncryptFile(inPath, outPath, keyHex, mode, ivHex): GmFileResult 文件加密
sm4DecryptFile sm4DecryptFile(inPath, outPath, keyHex, mode, ivHex): GmFileResult 文件解密
SM2 sm2GenerateKeypair sm2GenerateKeypair(): Sm2KeyPair 生成密钥对
sm2Sign sm2Sign(message, privateKeyHex, userId): string 签名 → DER hex
sm2Verify sm2Verify(message, signatureHex, publicKeyHex, userId): boolean 验签
sm2Encrypt sm2Encrypt(plaintext, publicKeyHex): string 公钥加密 → C1C3C2 hex
sm2Decrypt sm2Decrypt(ciphertextHex, privateKeyHex): string 私钥解密

验证说明(诚实分层,2026-07-16)内存型 9 API(SM3 sm3Hash/hmacSm3、SM4 sm4Encrypt/sm4Decrypt、SM2 全 5 个)已过 Android 设备端端到端实测(GM/T 官方向量 27 断言 ALL PASS)。文件型 3 APIsm3HashFile/sm4EncryptFile/sm4DecryptFile)算法正确性已验证;其 unifile:// 缓存路径的设备端文件读写实测随后续版本补充(同 iOS「下版本解锁」节奏)。

类型

// 文件型操作返回(字段 camelCase)
type GmFileResult = { sizeBytes: number; costMs: number };
// SM2 密钥对(字段 camelCase)
type Sm2KeyPair = { privateKeyHex: string; publicKeyHex: string };
  • SM3:哈希/HMAC 输出小写 hex(64 字符 / 32 字节)。sm3Hash 不会失败。
  • SM4keyHex = 16 字节(32 hex);mode"ECB" / "CBC" / "CTR"(大小写不敏感)。
    • ivHex:ECB 传 null;CBC / CTR 必填 16 字节 IV(32 hex)。
    • ECB / CBC 用 PKCS7 填充,CTR 为流(无填充)。密文以 base64 输出。
    • ⚠️ SM4 是非认证加密(非 AEAD):解密不校验完整性,密钥错/密文被篡改时 ECB/CBC 多半解填充失败抛错、CTR 则可能得到乱码。需防篡改请用 uni-nex-crypto 的 AES-256-GCM。CTR 严禁复用同一 (key, iv)。
  • SM2:私钥 64 hex、公钥 128 hex(X||Y,无 04 前缀;验签/加密也接受 04 前缀的 130 hex)。
    • 签名为标准 SM2-with-SM3userId 参与 ZA 预处理;传 null 用默认 "1234567812345678"签名与验签必须用相同 userId
    • 公钥加密输出 C1C3C2 密文 hex。

用法

import {
  sm3Hash, hmacSm3,
  sm4Encrypt, sm4Decrypt,
  sm2GenerateKeypair, sm2Sign, sm2Verify, sm2Encrypt, sm2Decrypt
} from "@/uni_modules/nex-gmcrypto";

// SM3 / HMAC-SM3
const digest = sm3Hash("abc");                       // 66c7f0f4...
const mac = hmacSm3("payload", "00112233445566778899aabbccddeeff");

// SM4(key=16 字节/32 hex;CBC 需 16 字节 IV)
const key = "0123456789abcdeffedcba9876543210";
const iv  = "00112233445566778899aabbccddeeff";
const ct  = sm4Encrypt("机密数据", key, "CBC", iv);   // base64
const pt  = sm4Decrypt(ct, key, "CBC", iv);          // "机密数据"
// ECB 不需 IV:sm4Encrypt("x", key, "ECB", null)

// SM2(密钥对 / 签名验签 / 公钥加解密)
const kp = sm2GenerateKeypair();
const sig = sm2Sign("报文", kp.privateKeyHex, null);          // DER hex
const ok  = sm2Verify("报文", sig, kp.publicKeyHex, null);    // true
const enc = sm2Encrypt("机密", kp.publicKeyHex);             // C1C3C2 hex
const dec = sm2Decrypt(enc, kp.privateKeyHex);              // "机密"

// 文件:sm3HashFile / sm4EncryptFile / sm4DecryptFile(路径进出,返回 GmFileResult)

H5 端

  • H5 端与 App 端由同一自研核心驱动,同算法、同真值(无需额外静态资源部署)。
  • 内存型 9 API 全部可用(sm3Hash/hmacSm3/sm4Encrypt/sm4Decrypt/sm2GenerateKeypair/ sm2Sign/sm2Verify/sm2Encrypt/sm2Decrypt);SM2 keygen 随机源走浏览器 crypto.getRandomValues
  • 文件型 3 API H5 不支持(sm3HashFile/sm4EncryptFile/sm4DecryptFile,浏览器无文件系统),调用抛错。
  • H5 端引擎初始化是异步的:建议应用启动时(仅 H5 分支)await ensureReady() 一次, 过早调用会抛「尚未就绪」错误。

平台与调试边界

  • app-android / app-ios / H5(web);各家小程序不支持。
  • Android 本地真机调试原生库需 HBuilderX ≥ 4.26(自定义调试基座),云打包不受此限。
  • iOS 端原生库含 Swift,宿主原生工程需开启「支持 Swift」。
  • 最终 App 打包由 HBuilderX / @dcloudio CLI 完成。

安全边界(务必阅读)

  • 软件级国密:纯软件实现,密钥与明文会出现在进程内存中。越狱 / Root 设备可在运行时注入、Hook、dump 内存读取密钥——软件层无法根除,敏感场景请结合设备风控(可配合 uni-nex-security-shield 做反越狱/反调试)。
  • 本插件的 SM2 实现不保证常量时间(constant-time),存在侧信道的理论风险。最高安全保障场景应使用硬件 HSM / 国密安全芯片(SE),本插件不替代硬件密码模块。
  • SM4 非认证加密、不防篡改(见上文);密钥/IV 的生成与管理由调用方负责(建议密钥走系统 Keystore/Keychain、CTR 的 IV 每次随机且不复用)。
  • 合规:金融/政务等强监管场景的合规性(密评、算法实现认证)需另行评估,本插件仅提供算法能力。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据。所有加解密/签名/摘要计算均在本地完成,无任何网络请求、不发送数据到任何服务器。

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。