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 在浏览器内用 sm-crypto 计算,适合核对向量与小文本;大文件批量哈希请走原生绑定或服务端实现。
性能差异
纯软件实现两者速度接近(SM3 略慢 10-20%)。关键差异在硬件加速:现代 x86/ARM CPU 有 SHA-NI 指令集,SHA-256 走硬件能快 5-10 倍;SM3 的硬件加速在国内的密码卡、TEE 环境里有。高吞吐场景(每秒上万次哈希)在通用服务器上 SHA-256 有实际性能优势,在国密硬件环境里 SM3 反超。
浏览器侧再补一句:Web Crypto 原生 SHA-256 通常远快于纯 JS 的 SM3。页面工具用来验证联调向量足够;若要哈希 GB 级数据,不要指望浏览器标签页。
HMAC 构造是通用的
HMAC 的构造不依赖具体哈希算法(密钥填充 + 两次哈希):
HMAC-SM3 = HMAC(K, m) 用 SM3 作底层
HMAC-SHA256 = HMAC(K, m) 用 SHA-256 作底层
国密 TLS(TLCP 协议)里的伪随机函数、密钥派生都用 HMAC-SM3;JWT 的 HS256 用 HMAC-SHA256。算法替换时 HMAC 层代码不用改,换个底层函数即可——但已签发的签名/MAC 会全部失效,迁移要另做双读窗口,不能只「换库」。
什么时候必须 SM3
- 等保 2.0 三级及以上:密码算法要求使用国密套件(SM2/SM3/SM4)
- 政务系统:电子签章(GB/T 38540)、电子证照用 SM3 做摘要
- 金融:人行《金融数据安全 数据安全分级指南》推动国密落地
- 电子合同/存证:司法链、公证处对接普遍要求 SM3 摘要
合同或验收条款里写了 GB/T 39786、国密算法清单时,选型讨论到此结束——再比「哪个更快」没有意义。
什么时候用 SHA-256
- 国际互操作(Git commit hash、Bitcoin、TLS 证书链)
- 已有系统无合规压力,改造成本大于收益
- 依赖硬件 SHA 加速的高吞吐场景
- 需要 FIPS 140 路径认证的部署(SM3 通常不在同一模块里)
现实里两者往往要共存
真实系统很少「整库只选一个哈希」——不同表面会跑很多年双栈:
- 对外接口(监管报送、合作方网关):合同要求 SM3 就 SM3,其余走 SHA-256——按合同定,不按「代码库偏好」定
- 内部存储:尽量固定一种算法;库里混存两种摘要,校验代码迟早长出两个分支,最后变成「为什么这个校验和对不上」的事故
- 协议层与应用层:TLCP 握手带 SM3,应用层仍可能用 SHA-256 签名——它们靠作用域共存,而不是在同一层协商
- 迁移陷阱:把已存的 SM3 摘要「改成」SHA-256,必须能重新哈希原文(不能对摘要再哈希还指望可验证)——计划的是数据访问路径,不只是换算法名
合规决策树
三个问题基本能定稿。第一:系统是否落入中国监管范围(政务、金融、关基,或合同引用 GB/T 39786)?是 → SM3,这是管辖问题不是技术口味。第二:同一部署是否还要 FIPS 验证?是 → SHA-256,因为 SM3 通常没有对应 FIPS 模块。第三:两边范围同时存在(国内部署对接全球平台)?做双摘要信封——国内腿用 SM3-HMAC,国际腿用 SHA-256,消息头同时携带。双栈多的是一个字段,不是一次重构。
迁移窗口怎么开
在现有 MAC/签名方案里替换摘要,会使所有旧标签失效:规划「读时双接受、写时只写新算法」的窗口,而不是旗日切换。令牌格式里从第一天就带上算法标识(alg: SM3 / alg: SHA256),旧记录可解释;事后补元数据比多带一个字节痛苦得多。
可用 哈希校验工具 对照同一文件的多种摘要,确认迁移脚本没有悄悄改了换行或编码。
常见坑
- 编码不一致:中文输入的 UTF-8/GBK 编码差异导致摘要对不上——联调先统一编码
- hex 大小写:SM3 输出习惯小写,部分 Java 库输出大写,比较时先 lowercase
- SM3 和 SM3-HMAC 混淆:裸哈希和带密钥的 HMAC 是两回事,接口文档要分清
- 把浏览器工具当批量引擎:小文本与标准向量没问题;超大输入请换原生实现
排查清单
- 合规要求 → SM3;国际互操作 → SHA-256
- 联调对不上 → 先用
abc测试向量隔离定位 - 中文输入 → 确认两端编码一致(UTF-8)
- 高吞吐 → 通用服务器 SHA-256 有硬件优势,国密硬件里 SM3 反超
- HMAC 场景 → 构造通用,替换成本在底层函数与存量标签
- 双栈场景 → 按表面分算法,并在令牌里显式标注
相关阅读
更完整的国密落地与编号说明见 国密算法入门、国密标准编号解读 与 国密实务指南;非对称选型见 SM2 和 RSA 怎么选。
实现注记
无论 SM3 还是 SHA-256,校验大文件都有同一个竞态要防:哈希耗时数十秒,期间换文件、换算法,过期结果晚到会把 A 文件的名配到 B 文件的哈希上,校验语义失效。这类工具需要乱序守卫:过期结果一到就丢,只认最后一次操作。
感谢阅读这篇 ToolVault 工具匣 技术文章。相关工具:SM3 哈希计算器、SM2 加解密与签名、SM4 加解密、哈希校验工具。访问 首页 查看更多开发者工具。
相关工具
相关文章
VIN 码校验位详解:第 9 位怎么算,车架号真假一测便知
VIN 车架号 17 位的结构与校验算法详解:WMI/VDS/VIS 拆解、第 9 位校验位的转写表与权重表手算示例、第 10 位年份码 30 年循环、常见校验失败原因,附在线 VIN 校验工具。
测试数据合规使用边界:为什么测试环境用真实用户数据本身就是违法
开发测试环境引用真实用户数据违反《个人信息保护法》:PIPL 明确目的限制原则,测试属于全新处理目的。合法替代数据四来源(脱敏/合成/公开测试段/自造)、「格式合法但随机」的技术原理(国标校验位),以及红线清单。附身份证/手机号/信用代码的校验位算法表。
个保法 PIA 影响评估自查:五类触发场景、评估三要素与实操框架
《个人信息保护法》第 55-56 条的个人信息保护影响评估(PIA):哪五类处理活动必须事前评估、评估报告的三要素结构、报告留存三年的要求,以及数据地图→风险矩阵→措施核对的自查框架。附与等保/密评的三位一体关系。