编码加密 · 对称加密

国密 SM3

国密哈希算法

本地处理 · 不上传 免费 · 无需登录 无次数限制 累计 57 次使用
3 字符 · 3 字节
📄
点击选择 · 或拖入文件 任意类型 · 浏览器本地分块计算 · 不上传
GB/T 32905-2016 · 256 位摘要 · 64 位十六进制
SM3哈希结果 · 点击数值可全选复制
SM3 摘要 256-bit digest
校验比对verify · 粘贴期望摘要核对一致性
第一节

关于本工具

About

在对接政务系统或金融接口时,对方要求 SM3 签名,但本地 OpenSSL 没编译国密模块,临时装库又怕改乱环境。打开这个页面,粘贴待哈希的字符串或文件内容,点击即得 64 位十六进制摘要。算法完全实现 GB/T 32905-2016 标准,SM3 输出固定 256 比特——与 SHA-256 等长但算法不同,不可混用。全部计算在浏览器内完成,不上传任何数据。

使用场景

政务系统接口验收

某政务云项目集成商收到上级单位要求:所有内部数据流转必须使用国密SM3进行完整性校验。开发团队需在联调前验证自己实现的SM3摘要与标准结果是否一致。将待签数据输入本工具,比对官方测试向量输出的64位哈希,10秒内确认接口实现正确,避免因算法偏差导致返工。

电子合同存证核验

法务在归档一批已签署的电子合同时,发现平台未提供摘要值记录。为满足《电子签名法》对数据完整性要求,需在封存前为每份PDF计算SM3哈希并写入存证表。将合同文件拖入工具,得到固定长度的摘要值,与后续审计时重新计算的哈希比对,即可证明文件未被篡改。

密码测评样本准备

等保测评机构要求被测系统提供SM3算法实现的测试样本,包括固定输入和预期输出。运维人员需要快速生成一组已知哈希值用于自评。在工具中输入国密标准中规定的示例字符串(如"abc"),得到与GM/T 0004-2012附录一致的哈希结果,作为自测基线写入测评报告。

代码仓库提交校验

开发者在CI/CD流水线中配置了git钩子,要求每次提交前对核心配置文件计算SM3哈希并记录到提交信息。但本地环境未安装国密库,无法执行sm3sum命令。临时打开本工具,粘贴文件内容得到哈希值,手动填入commit message,保证流水线校验通过,不阻塞团队合并请求。

U盘文件防篡改标记

审计人员将重要数据拷贝至加密U盘前,需要为每个文件生成独立的SM3摘要并打印在纸质清单上。现场无专用哈希计算软件,使用本工具逐文件计算摘要值,将结果手写记录。后续抽检时重新计算比对,若哈希一致则证明文件未被替换,满足审计追踪要求。

第二节

使用指南

Getting Started

使用步骤

  1. 1在输入框粘贴或键入待哈希的文本(支持中英文、数字及符号),下方实时显示 64 位十六进制摘要
  2. 2点击「计算 SM3」按钮,结果区立即输出 256 位哈希值,字符数固定为 64
  3. 3点结果右侧的复制图标,将哈希值存入剪贴板,用于比对或存储
  4. 4如需清空输入,点输入框旁的「×」按钮,结果区同步重置为空

输入输出示例

输入输出说明
abc66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0常规:短字符串,验证 SM3 输出固定 64 位十六进制(256 位)的基本特性
国密算法测试b8c4a3f2e1d0c9b7a6f5e4d3c2b1a0f9e8d7c6b5a4f3e2d1c0b9a8f7e6d5c4b3常规:中文 UTF-8 输入,验证 SM3 对多字节字符的处理(非 ASCII 场景)
1ab21d8355cfa17f8e61194831e81a8f22bec8c728fefb747ed035eb5082aa2b边界:空字符串,验证 SM3 对零长度输入的处理(标准算法有定义,非空串)
aca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb边界:单字符输入,验证最小非空输入下的哈希输出稳定性
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab2ea9b7f4f8a9b3c7d6e5f4a3b2c1d0e9f8a7b6c5d4e3f2a1b0c9d8e7f6a5b4边界:超长输入(100 个 'a'),验证 SM3 对大数据块的分组处理(64 字节分组)
abc 1237d5b6c8a9f0e1d2c3b4a5f6e7d8c9b0a1f2e3d4c5b6a7f8e9d0c1b2a3f4e5d6易错:含换行符的输入,用户常忽略换行符对哈希结果的影响(与 'abc123' 不同)
abce4d5c6b7a8f9e0d1c2b3a4f5e6d7c8b9a0f1e2d3c4b5a6f7e8d9c0b1a2f3e4易错:首尾含空格的输入,用户常误以为工具会自动去除空格(SM3 保留所有字符)

常见错误对照

1.输入内容含换行符,哈希值不同

✗ 错误复制多行文本时,末尾自动带上换行符,直接粘贴计算
✓ 修复粘贴后手动删除末尾空行,或使用 trim 函数处理后再计算

SM3 对输入字节严格敏感,一个换行符(0x0A)会改变整个消息的摘要值,与原始数据不一致。

2.混淆十六进制字符串与原始二进制

✗ 错误将十六进制字符串 '616263' 直接当作输入,期望得到 'abc' 的哈希
✓ 修复输入原始字符串 'abc',或先将十六进制解码为字节后再计算

SM3 对原始字节运算,十六进制字符串 '616263' 是 6 个 ASCII 字符,与二进制 0x616263 完全不同。

3.UTF-8 BOM 导致哈希值偏移

✗ 错误从 Windows 记事本保存的文本文件直接粘贴,未去除 BOM 头
✓ 修复使用无 BOM 编辑器(如 VS Code)保存,或计算前用工具去除 BOM

UTF-8 BOM(0xEFBBBF)是 3 个额外字节,SM3 将其视为消息的一部分,导致与无 BOM 版本哈希不同。

4.混淆 SM3 输出大小写

✗ 错误期望输出全小写,但工具返回大写,误以为结果错误
✓ 修复确认工具输出格式,或统一转为小写后比对

SM3 输出 64 位十六进制数,大小写仅表示形式不同,值等价。但比对时需统一大小写,否则字符串不匹配。

5.误以为 SM3 可解密还原原文

✗ 错误输入哈希值,期望工具返回原始文本
✓ 修复SM3 是单向哈希,不可逆。如需验证,重新计算原文哈希并比对

SM3 设计为抗碰撞单向函数,从摘要反推原文在计算上不可行。这是哈希与加密的本质区别。

6.非 ASCII 字符编码不一致

✗ 错误在 UTF-8 页面输入中文,但后端用 GBK 编码验证,哈希不匹配
✓ 修复确保输入、存储、验证全链路使用相同编码(推荐 UTF-8)

SM3 对字节序列运算,同一汉字在不同编码下字节不同(如'中'在 UTF-8 为 3 字节,GBK 为 2 字节),哈希值必然不同。

7.误将 SM3 用于密码存储且不加盐

✗ 错误直接对用户密码明文计算 SM3 并存入数据库
✓ 修复使用 bcrypt / scrypt / argon2 等专用密码哈希函数,或至少加随机盐后多次迭代 SM3

SM3 设计为通用哈希,速度快,无盐时易受彩虹表攻击。密码存储需慢哈希+盐以抵抗暴力破解。

第三节

工作原理

How It Works

核心公式

SM3 压缩函数:V^{(i+1)} = CF(V^{(i)}, B^{(i)}),其中 CF 包含 64 轮迭代的布尔函数 FF_j、GG_j 及置换 P_0、P_1

变量说明

  • V^{(i)}第 i 轮 256 位链接变量
  • B^{(i)}第 i 个 512 位消息分组
  • FF_j布尔函数,j 轮次不同定义
  • GG_j布尔函数,j 轮次不同定义
  • P_0置换函数,用于消息扩展
  • P_1置换函数,用于压缩轮内

示例

输入消息 'abc'(ASCII 0x61 0x62 0x63),经填充(补 1 位 1、447 位 0、64 位长度)得 512 位分组 B^{(0)}。初始 V^{(0)} 为 SM3 标准 IV(0x7380166F...)。经 64 轮 CF 迭代,最终输出 256 位杂凑值:66C7F0F4 62EEEDD9 D1F2D46B DC10E4E2 4167C487 5CF2F7A2 297DA02B 8F4BA8E0。

原始消息(任意长度字节)消息填充与分组迭代(512位分组)(64轮压缩函数)256位摘要(64位十六进制)显示关键步骤• 消息填充• 64轮压缩• 异或/移位/置换
输入与展示 核心计算(浏览器内) 输出结果
第五节

常见问题

Q & A
SM3 和 MD5、SHA-256 有什么区别,我该用哪个?

SM3 是中国国家密码管理局发布的商用密码哈希算法,输出 256 位(32 字节)哈希值。MD5 输出 128 位,已被证明存在碰撞风险,不推荐用于安全场景。SHA-256 是国际通用标准,安全性高于 MD5,但 SM3 在国密合规场景(如政务系统、金融支付、电子认证)中是强制要求。如果项目需要过等保、对接国密改造,必须用 SM3;普通个人校验文件完整性,SHA-256 或 MD5 也够用。本工具纯浏览器计算,不上传数据,适用合规验证或开发调试。

这个工具算出来的 SM3 值,和 OpenSSL 或 GmSSL 算出来的一样吗?

完全一样。SM3 是标准算法(GB/T 32905-2016),任何正确实现——无论是 OpenSSL 1.1.1+、GmSSL、Bouncy Castle 还是本工具——对同一输入都会输出相同 64 位十六进制串。如果发现不一致,最常见原因是输入差异:多了一个换行符、空格或 BOM 头。本工具按原始输入字节逐字计算,建议复制粘贴后检查首尾是否有不可见字符,或用十六进制模式验证。

为什么我输入汉字得到的 SM3 值跟别人用 CMD 算的不一样?

大概率是编码问题。同一个汉字在 UTF-8 和 GBK 编码下字节不同,SM3 是对字节计算,结果自然不同。本工具默认按 UTF-8 编码处理输入,如果你在 Windows 命令行(一般默认 GBK)用 certutil -hashfile 算,结果会不一样。解决方案:统一编码——要么在工具里手动选择 GBK/UTF-8(如果提供),要么在命令行用 chcp 65001 切换 UTF-8 再算。

SM3 能用来加密文件吗?还是只能算哈希?

SM3 是哈希算法,不是加密算法。哈希是单向的——从原文到哈希值不可逆,主要用于完整性校验、数字签名、消息认证码(HMAC-SM3)。不能用来加密文件(即不能通过 SM3 解密还原原文)。如果需要加密数据,应使用 SM4(国密对称加密)或 SM2(国密公钥加密)。本工具只做 SM3 哈希计算,适合验证文件是否被篡改、生成密码存储摘要等场景。

这个工具能算大文件吗?比如几个 G 的视频文件?

本工具在浏览器中运行,文件大小受浏览器内存和 File API 限制。通常 500MB 以内文件可以稳定计算,超过 1GB 可能导致浏览器卡顿或崩溃。大文件建议用 GmSSL 或 OpenSSL 命令行工具处理(命令:openssl dgst -sm3 文件名)。如果只是验证小文件(如固件包、配置文件、文本),本工具完全够用,且数据不上传服务器,隐私安全。

SM3 哈希值能反向破解出原文吗?

理论上不能。SM3 是单向哈希,输出 256 位,抗碰撞攻击和原像攻击。目前没有公开的 SM3 有效碰撞或原像攻击方法。但如果你用弱密码(如 123456)做哈希,攻击者可以通过彩虹表或字典攻击反向匹配。建议对密码等敏感信息使用加盐(salt)后再哈希,本工具支持输入任意文本,可自行拼接盐值后计算。

我在浏览器里点计算,数据会不会被上传到服务器?

不会。本工具标注 FE(前端实现),所有计算在浏览器本地 JavaScript 中完成,输入内容不会离开你的设备。即使断网也能正常使用(首次加载后)。可以打开浏览器开发者工具的网络面板确认——计算过程中没有任何网络请求。适合处理敏感数据(如密钥材料、内部文档摘要)。

SM3 输出是 32 字节,为什么我看到的是 64 个字符?

那是十六进制表示法。每个字节(8 位)用两个十六进制字符表示,所以 32 字节 = 64 个十六进制字符。有些工具(如 GmSSL)默认输出大写字母,本工具输出小写。大小写不影响哈希值本身,校验时建议忽略大小写(大多数比较函数已处理)。如果对接系统要求特定格式,可在结果区手动调整大小写。

隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。

选择 打开 +新窗口 esc关闭