piapia123
zh

HMAC 签名计算

编码加密

所有处理都在浏览器本地完成,数据不上传服务器

输入
输出

用密钥和消息算出 HMAC 签名,支持 SHA-1、SHA-256、SHA-512,输出十六进制或 Base64。密钥按 UTF-8 字节参与运算,所以含空格、中文或 emoji 的密钥都能与 Node、Java、Python 算出一致的结果 —— 这是对接签名接口时最常踩的坑。密钥必须填写:空密钥在数学上「能算」,但算出来的签名与你想要的结果毫无关系,而且看起来完全正常,所以这里直接拦下来而不是让你拿去服务端撞一堵没有线索的墙。另外,HMAC 与「先拼密钥再哈希」不是一回事,后者存在长度扩展攻击。

功能

  • 三种算法:HMAC-SHA1、HMAC-SHA256、HMAC-SHA512
  • 密钥与消息分开输入,长消息里不会粘错
  • 密钥与消息都按 UTF-8 字节处理,与 Node、Java、Python 结果一致
  • 输出十六进制或 Base64
  • 空密钥直接报错,不产出「看起来正常」的签名
  • 密钥只在本机参与运算,不会因为任何原因发出去

使用方法

  1. 在「密钥」里填写签名密钥
  2. 把消息粘贴进输入框
  3. 选择算法与输出编码,按 Ctrl/⌘ + Enter 或点「运行」
  4. 点「复制」取走签名

常见问题

HMAC 和直接对「密钥 + 消息」做哈希有什么区别?
HMAC 会先把密钥做一次异或填充,再分内外两轮哈希,这个结构让它不受长度扩展攻击影响。而 hash(密钥 + 消息) 若用的是 MD5、SHA-1、SHA-256 这类结构,攻击者能在不知道密钥的情况下续算出更多有效签名。对接接口时不要自己拼字符串。
为什么一定要填密钥?
空密钥算出来的是「用空字符串做密钥」的签名,数学上合法,但对你没有任何用处,而且看起来和正常签名一模一样 —— 拿去对接只会得到一句没有线索的验证失败。与其让你去猜,不如在这里直接拦住。
算出来的签名和别人给的不一样?
按顺序排查三件事:密钥是不是按 UTF-8 字节处理(本工具是)、消息里有没有多余的空格或换行、输出编码是不是一致(hex 与 Base64 是同一段字节的两种写法)。前两条对不上时,结果会完全不同。
提示「当前环境不提供 Web Crypto」是怎么回事?
HMAC 走的是浏览器原生接口 crypto.subtle,而它只在安全上下文里存在:https:// 或 localhost / 127.0.0.1。用 http:// 或内网 IP 打开本页时它不可用 —— 这是浏览器的安全策略。请换用 https 地址,或改用别的工具计算。
我的密钥会被上传吗?
不会。密钥与消息都只在浏览器内存里参与运算,页面不发送任何请求,断网也能用。也正因如此,验证签名这件事同样可以在这里做 —— 但请只在可信的设备上粘贴生产密钥。

相关工具