SM3 是什么
SM3 是我国自主设计的密码杂凑(哈希)算法,标准编号 GB/T 32905-2016,输出 256 位(32 字节)摘要。它把任意长度数据压缩成固定长度指纹,具备雪崩效应与抗碰撞设计目标,用于数字签名中的摘要计算、消息认证码、口令加盐哈希与文件完整性校验。杂凑不可逆,不能当加密算法用。
基本信息
| 标准 | GB/T 32905-2016 信息安全技术 SM3 密码杂凑算法 |
|---|---|
| 输出长度 | 256 位(32 字节)摘要 |
| 特性 | 雪崩效应、抗碰撞设计目标,与主流杂凑算法同类定位 |
| 常见用法 | 签名摘要、口令加盐哈希、数据完整性校验、HMAC 构造 |
| 常用实现 | OpenSSL 的 sm3 摘要、GmSSL 工具、国产密码库与密码机 |
| 合规场景 | 密评与等保中涉及完整性保护的实现方式之一 |
典型使用场景
- 验签前对报文计算摘要,作为签名与验签流程的输入
- 文件与固件发布时提供摘要值,接收方校验下载完整性
- 与 HMAC 组合做接口鉴权,防止报文被篡改
- 口令存储中作为哈希算法之一,需配合随机盐与迭代放大计算成本
- 等保与密评中说明完整性保护机制的实现依据
命令行计算 SM3
命令行计算 SM3
echo -n "hello" | openssl dgst -sm3 # OpenSSL 支持 sm3 时可用
# 或用 GmSSL:echo -n hello | gmssl sm3
gmssl sm3 -in firmware.bin -out firmware.sm3 # 对文件求摘要并留存
openssl dgst -sm3 -hmac "secret-key" msg.txt # HMAC-SM3:报文认证使用位置与注意点
| 使用位置 | 正确做法 | 常见错误 |
|---|---|---|
| 签名摘要 | 对报文求 SM3 后再签名,验签侧同样先求摘要 | 签名与验签所用摘要不一致导致验签失败 |
| 完整性校验 | 摘要值与发布物分开存放并告警比对 | 摘要与文件放在同一下载目录,可被同步替换 |
| 口令哈希 | 加随机盐、使用可迭代的慢哈希构造 | 裸 SM3 迭代次数过少,可被暴力枚举 |
| 接口鉴权 | HMAC-SM3 带密钥,服务端校验时间戳与随机数 | 只对部分字段计算摘要,字段可被追加篡改 |
摘要值一般用十六进制表示,长度固定 64 个字符;比对时建议做长度与格式校验,避免因截断比较引入绕过。
SM3 与 SM2、SM4 分工不同:SM2 用于签名与非对称加密,SM4 用于对称加密,SM3 只做摘要与完整性,实现时不要互相替代。