Skip to content
安全2026-09-103 分钟阅读

SM3 和 SHA-256 有什么区别?国密哈希与 NIST 哈希的对比与选择

一句话结论

SM3 和 SHA-256 安全强度同级(都输出 256 位摘要),技术选型上可以互换;真正的分界线还是合规——国密场景必须 SM3,国际场景默认 SHA-256。

基本面对比

| 维度 | SM3 | SHA-256 | |---|---|---| | 标准归属 | 中国 GM/T 0004-2012 / GB/T 32905-2016 | 美国 NIST FIPS 180-4 | | 摘要长度 | 256 位 | 256 位 | | 分组长度 | 512 位 | 512 位 | | 结构 | Merkle-Damgård(64 轮迭代) | Merkle-Damgård(64 轮迭代) | | 安全强度 | 128 位(抗碰撞) | 128 位(抗碰撞) | | 已知攻击 | 无实际威胁 | 无实际威胁(理论碰撞约 2^128 工作) | | 硬件加速 | 国密芯片/密码卡 | CPU SHA-NI 指令(极快) |

两者结构同源(都是 Merkle-Damgård 迭代),轮函数设计不同——SM3 的消息扩展和压缩函数是独立设计,经过全国密码算法设计竞赛打磨。密码学上两者目前都没有被实际攻击的先例

标准测试向量(联调必备)

SM3("abc")    = 66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0
SM3("")       = 1ab21d8355cfa17f8e61194831e81a8f22bec8c728fefb747ed035eb5082aa2b

SHA-256("abc") = ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad

联调对不上时,先用在线 SM3 工具算一遍 abc——和上面一致说明你的实现没问题,问题在传输编码(UTF-8 vs GBK、hex 大小写、有没有带换行符)。

性能差异

纯软件实现两者速度接近(SM3 略慢 10-20%)。关键差异在硬件加速:现代 x86/ARM CPU 有 SHA-NI 指令集,SHA-256 走硬件能快 5-10 倍;SM3 的硬件加速在国内的密码卡、TEE 环境里有。高吞吐场景(每秒上万次哈希)在通用服务器上 SHA-256 有实际性能优势,在国密硬件环境里 SM3 反超。

HMAC 构造是通用的

HMAC 的构造不依赖具体哈希算法(密钥填充 + 两次哈希):

HMAC-SM3   = HMAC(K, m) 用 SM3 作底层
HMAC-SHA256 = HMAC(K, m) 用 SHA-256 作底层

国密 TLS(TLCP 协议)里的伪随机函数、密钥派生都用 HMAC-SM3;JWT 的 HS256 用 HMAC-SHA256。算法替换时 HMAC 层代码不用改,换个底层函数即可。

什么时候必须 SM3

  1. 等保 2.0 三级及以上:密码算法要求使用国密套件(SM2/SM3/SM4)
  2. 政务系统:电子签章(GB/T 38540)、电子证照用 SM3 做摘要
  3. 金融:人行《金融数据安全 数据安全分级指南》推动国密落地
  4. 电子合同/存证:司法链、公证处对接普遍要求 SM3 摘要

什么时候用 SHA-256

  1. 国际互操作(Git commit hash、Bitcoin、TLS 证书链)
  2. 已有系统无合规压力,改造成本大于收益
  3. 依赖硬件 SHA 加速的高吞吐场景

常见坑

  • 编码不一致:中文输入的 UTF-8/GBK 编码差异导致摘要对不上——联调先统一编码
  • hex 大小写:SM3 输出习惯小写,部分 Java 库输出大写,比较时先 lowercase
  • SM3 和 SM3-HMAC 混淆:裸哈希和带密钥的 HMAC 是两回事,接口文档要分清

排查清单

  1. 合规要求 → SM3;国际互操作 → SHA-256
  2. 联调对不上 → 先用 abc 测试向量隔离定位
  3. 中文输入 → 确认两端编码一致(UTF-8)
  4. 高吞吐 → 通用服务器 SHA-256 有硬件优势,国密硬件里 SM3 反超
  5. HMAC 场景 → 构造通用,替换成本在底层函数

本文由 ToolVault 工具匣 提供。相关工具:SM3 哈希计算器SM2 加解密与签名SM4 加解密哈希校验工具。相关阅读:SM2 和 RSA 怎么选国密算法入门指南。访问 首页 查看更多开发者工具。


广告