1、国密算法概述:SM2/SM3/SM4/SM9算法原理、标准规范与适用场景
国密算法,说白了就是咱们国家自己的密码算法标准。早些年很多系统用的都是国际算法,比如 RSA、AES 这些。但现在形势变了,等保 2.0 和密评都要求“优先采用国密算法”。所以我个人建议,做云上安全方案的朋友,最好早点把国密集成能力储备起来。
嗯,这里先给大家梳理一下核心的四类算法:
- SM2:非对称密码算法(椭圆曲线公钥密码)
- SM3:密码杂凑算法(哈希算法)
- SM4:对称密码算法(分组密码)
- SM9:基于标识的非对称密码算法(IBC)
我在项目中遇到过不止一次,很多人把 SM2 直接类比成 RSA,把 SM4 直接类比成 AES。其实这个思路大方向没错,但细节差异很大,特别是密钥管理和证书格式上。咱们一个一个看。
1.1 SM2:椭圆曲线公钥密码算法
SM2 是国密体系里的“门面担当”。它基于椭圆曲线密码学(ECC),但和我们熟悉的 ECDSA 或 ECDH 不是同一套参数。为什么?因为它用的曲线参数是咱们国家自研的。
标准上,SM2 分两个部分:
- 数字签名算法——对标 ECDSA
- 密钥交换与加密算法——对标 ECDH + 加密
我记得最早接触 SM2 是在 2017 年做某政务云项目。当时厂商提供的 SDK 里,SM2 公钥长度是 64 字节,私钥 32 字节。这个长度在性能上比 RSA-2048 快很多,但在证书解析和跨平台兼容上踩了不少坑。
1.2 SM3:密码杂凑算法
SM3 输出 256 位摘要,也就是 32 字节。它和 SHA-256 的对标关系非常直接。你想想看,SHA-256 在区块链和 TLS 里用得那么多,SM3 在国产化场景里就是它的“平替”。
标准编号是 GM/T 0004-2012。它的压缩函数结构和 SHA-256 有相似之处,但内部的置换和消息扩展做了特别设计。安全性上,SM3 的摘要长度和 SHA-256 一样,抗碰撞能力在理论上优于 MD5 当然没问题。
曾经在合规审查时,客户要求所有日志完整性校验必须用 SM3。我当时用的方案是 KMS 的 SM3 计算接口直接出摘要,不走本地实现,这样审计链路上更干净。
1.3 SM4:分组密码算法
SM4 是对称加密,分组长度 128 位,密钥长度 128 位。标准是 GM/T 0002-2012。它的加密轮数是 32 轮。我个人的评价是:SM4 的轮函数设计非常规整,软硬件实现都很友好。
在实际使用中,SM4 应用最广的是数据库加密和 VPN 加密。尤其是在阿里云 KMS 里,SM4 的密钥可以用作信封加密的数据密钥,也可以直接用于小包加密。
SM4 的操作模式我们常见的有:
- ECB 模式——基本不用,不安全
- CBC 模式——用得最多,需要 IV
- GCM 模式——同时加密和认证,我也推荐用
说句实在话,很多开发者刚接触 SM4 时,容易把密钥长度搞错。SM4 密钥是 16 字节,不是 32 字节。我之前在对接某个第三方网关时就遇到了这个问题,对方传了个 32 字节的密钥过来,SM4 直接解析失败。
1.4 SM9:基于标识的非对称密码算法
SM9 是最特殊的一个,也是我个人觉得未来潜力最大的。它不需要数字证书。私钥由密钥生成中心(KGC)根据用户标识(比如邮箱、手机号、身份证号)生成。
标准编号是 GM/T 0044-2016。SM9 的核心是双线性对运算,所以计算开销比 SM2 大不少。但它省去了证书管理和验证的复杂流程,特别适合 IoT 和车联网这种设备数量大、证书管理成本高的场景。
举个例子:我记得有个智能门锁的项目,设备端存储资源非常有限,没办法存储完整的 X.509 证书链。用 SM9 的话,只要预置 KGC 公参数,用户标识就是公钥,私钥在安全环境下生成后注入设备。这就解决了证书分发的大难题。
整体知识体系与适用场景
下面的 SVG 图把这四种算法在《阿里云KMS与国密集成实践》中的定位和关系画了出来。你可以看到,SM2 和 SM4 是最常用的,SM3 作为摘要算法贯穿其中,SM9 则专注于特定场景。
四种算法的核心参数对比
下面这张表能帮助你快速区分这四个算法。在我做技术选型时,常常把它贴在墙上做参考。
| 算法 | 类型 | 密钥/摘要长度 | 标准编号 | 典型场景 |
|---|---|---|---|---|
| SM2 | 非对称公钥 | 公钥 64B / 私钥 32B | GM/T 0003-2012 | 数字签名、密钥协商、证书签发 |
| SM3 | 杂凑 (Hash) | 输出 32B (256bit) | GM/T 0004-2012 | 完整性校验、数字签名配合 |
| SM4 | 对称分组 | 密钥 16B / 分组 16B | GM/T 0002-2012 | 数据加密、VPN、数据库加密 |
| SM9 | 标识密码 (IBC) | 用户标识可变 | GM/T 0044-2016 | IoT、无证书场景、邮件加密 |
总结与选型建议
如果你刚接触国密,我建议先从 SM2 + SM4 的组合入手。这个组合在阿里云 KMS 里支持得最成熟。SM3 作为底层工具函数,几乎每个签名和加密流程里都会用到它,算是“万金油”。
SM9 嘛,听起来很酷,但实际落地时对 KGC 的安全要求极高,而且密钥恢复流程相对复杂。我个人觉得它更适合在控制成本且设备量极大的场景下用。