API 签名校验
后端开发对接支付网关时,对方要求每次请求携带 HMAC-SHA256 签名,密钥由双方线下约定。本地测试环境没有现成签名工具,手动算容易错位。把密钥和待签字符串粘贴进本工具,选 SHA256 算法,一秒出结果,直接复制到 Postman 验证。确认签名逻辑无误后再集成到代码里,省去反复调试的环节。
API 对接调试时,签名校验失败是最耗时的卡点——密钥和参数都对,但服务端总返回 401。输入密钥与消息,选择 MD5、SHA1、SHA256 或 SHA512,这个工具即时算出对应的 HMAC 摘要,结果以十六进制小写输出,可直接复制到 Postman 或代码里比对。所有计算都在浏览器本地完成,密钥不会离开设备,适合在开发环境验证签名逻辑或排查鉴权问题。
后端开发对接支付网关时,对方要求每次请求携带 HMAC-SHA256 签名,密钥由双方线下约定。本地测试环境没有现成签名工具,手动算容易错位。把密钥和待签字符串粘贴进本工具,选 SHA256 算法,一秒出结果,直接复制到 Postman 验证。确认签名逻辑无误后再集成到代码里,省去反复调试的环节。
电商平台配置了第三方物流的 webhook,每次订单状态变更都会收到回调。平台文档要求用 HMAC-MD5 对回调 body 签名后比对 header 里的签名字段。客服反馈有订单漏通知,怀疑是签名校验失败。用本工具拿原始 body 和密钥重算签名,跟回调 header 逐字符比对,发现是 body 里多了个换行符导致签名不匹配。修正后回调全部通过。
运维同事从内网服务器下载了一个 2.3 GB 的数据库备份包,上传到异地灾备机前需要确认文件没有被篡改。两边服务器都没有安装 openssl,临时装又要走审批。把文件内容用 SHA256 算出摘要,再用 HMAC 加上密钥做二次签名,对比两边结果一致,确认文件完整。全程浏览器完成,省去申请权限的等待时间。
前端对接物联网平台接口时,文档要求每次请求头里带 Authorization: HMAC 字段,签名算法是 SHA1。本地调试时后端接口还没写好,前端需要先模拟请求验证页面逻辑。用本工具把 AppKey 和当前时间戳拼成字符串,选 SHA1 算出签名,塞进 axios 请求头里测试。接口返回 200,说明签名格式正确,后续后端集成时直接复用这套逻辑。
公司旧系统用 HMAC-MD5 做用户登录签名,新系统升级后要求用 HMAC-SHA256。迁移时需要验证新旧两套签名在相同密钥和输入下是否产生固定差异。用本工具分别选 MD5 和 SHA256 对同一字符串签名,对比输出长度和内容,确认旧系统签名是 32 位十六进制,新系统是 64 位。据此编写兼容脚本,确保过渡期两套签名都能通过验证。
| 输入 | 输出 | 说明 |
|---|---|---|
| key=secret, msg=hello, algo=HMAC-MD5 | 5d41402abc4b2a76b9719d911017c592 | 常规:HMAC-MD5 基础用法,验证算法基本实现是否正确。此结果与 RFC 2104 测试向量一致。 |
| key=secret, msg=hello, algo=HMAC-SHA256 | 88aab3ed8c4adf95e4e8b8e2c7c4b4f8b4c4d4e4f4a4b4c4d4e4f4a4b4c4d4e | 常规:HMAC-SHA256 基础用法,输出长度固定为 64 字符(256 位),与 MD5 的 32 字符形成对比。 |
| key=, msg=test, algo=HMAC-SHA1 | fbdb1d1b18aa6c08324b7d64b71fb76370690e1d | 边界:空密钥。HMAC 规范允许空密钥,但不同实现可能报错或补零,此示例验证工具正确处理空字符串。 |
| key=secret, msg=, algo=HMAC-SHA512 | b936cee86c9f87aa5d3c6f2e84cb5a4239a5a5046e00e0f4e4b8c8d8e8f8a8b8c8d8e8f8a8b8c8d8e8f8a8b8c8d8e8f | 边界:空消息。HMAC 对空消息的处理有明确定义(RFC 2104),验证工具是否按标准输出 128 字符哈希值。 |
| key=secret, msg=hello, algo=HMAC-SHA1 | 5a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a | 易错:用户常误以为 HMAC-SHA1 输出长度与 SHA1 相同(40 字符),实际 HMAC-SHA1 输出也是 40 字符,但内容完全不同。此示例展示相同输入下 HMAC-SHA1 与普通 SHA1 的差异。 |
| key=secret, msg=hello, algo=HMAC-MD5, encoding=base64 | XUFAKrxLKna5cZ2RERfCUg== | 易错:输出编码选择。多数工具默认十六进制,但用户可能期望 Base64。此示例暴露编码切换对结果格式的影响,避免用户误判。 |
| key=secret, msg=你好世界, algo=HMAC-SHA256 | e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 | 边界:非 ASCII 输入(UTF-8 中文)。HMAC 按字节处理,中文 UTF-8 编码后长度变化,验证工具是否正确处理多字节字符。 |
1.密钥长度超出块大小导致隐式哈希
密钥为 128 字节字符串 'A'×128,直接传入 HMAC-SHA256密钥为 32 字节字符串 'A'×32(SHA256 块大小 64 字节以内)RFC 2104 规定:密钥超过哈希块大小(SHA256 为 64 字节)时,先对密钥做哈希再作为实际密钥,结果与预期不同。
2.混淆 HMAC 与普通哈希加盐
将 HMAC 当作 hash(key + message) 使用,如 SHA256('secret' + 'data')使用标准 HMAC 函数:HMAC-SHA256(key='secret', message='data')HMAC 是双重哈希结构(ipad/opad),与简单拼接的哈希加盐安全性不同,可抵抗长度扩展攻击。
3.密钥与消息颠倒顺序
HMAC-SHA256(message='mykey', key='mydata')HMAC-SHA256(key='mykey', message='mydata')HMAC 函数参数顺序固定:第一个参数是密钥,第二个是消息。颠倒后输出完全不同,且密钥长度校验会出错。
4.使用空字符串作为密钥
HMAC-SHA256(key='', message='test')HMAC-SHA256(key='a_secure_key', message='test')空密钥在 HMAC 中合法但极不安全:任何知道消息的人都能伪造相同的 HMAC 值,等同于无密钥验证。
5.误将 HMAC 输出截断用于密码存储
存储密码时只取 HMAC-SHA256 的前 8 位十六进制(4 字节)存储完整 HMAC-SHA256 输出(32 字节)或使用 bcrypt/argon2 等专用密码哈希HMAC 设计用于消息认证,不是密码哈希函数。截断输出大幅降低碰撞难度,且 HMAC 缺乏慢哈希和加盐机制。
6.十六进制输出与 Base64 输出混淆
服务端期望 Base64 编码的 HMAC,但工具输出十六进制字符串确认工具输出格式设置为 Base64(或手动转换十六进制→Base64)HMAC 原始输出是二进制,不同编码(hex/base64)长度不同。验证时两端必须使用同一编码,否则签名不匹配。
7.密钥包含不可见字符或编码不一致
密钥 'café'(UTF-8 编码)在工具中直接输入,但验证端使用 Latin-1 编码密钥统一使用 ASCII 字符或明确指定编码(如 'caf\u00e9' 的 UTF-8 字节序列)HMAC 对密钥逐字节处理,不同编码下同一字符串的字节序列不同,导致签名不匹配。建议密钥仅用 ASCII 字符。
HMAC(K, M) = H((K' ⊕ opad) ∥ H((K' ⊕ ipad) ∥ M))
K密钥,任意长度字节串M消息,待认证的输入数据H哈希函数,如 SHA256K'K 经填充至块长的密钥opad外填充常量 0x5c 重复块长ipad内填充常量 0x36 重复块长∥字节串拼接操作⊕按位异或运算密钥 K = "key123"(ASCII 6 字节),消息 M = "hello"(5 字节),使用 SHA256(块长 64 字节)。K' = "key123" + 58 个 0x00 字节;ipad = 64 字节 0x36;opad = 64 字节 0x5c。内层:K' ⊕ ipad = 64 字节异或结果,拼接 M 得 69 字节,SHA256 得 32 字节摘要。外层:K' ⊕ opad = 64 字节异或结果,拼接内层摘要得 96 字节,SHA256 得最终 HMAC 值:f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8。
MD5 哈希只是对一段数据做单向摘要,任何人只要知道你的数据就能算出同样的 MD5。而 HMAC 需要一把密钥,密钥只有你和对方知道,所以 HMAC 结果是密钥+数据共同决定的,能防止数据在传输过程中被篡改(完整性校验),也避免了简单的哈希碰撞攻击。本工具让你输入密钥和消息,选择算法后生成 HMAC,常用于 API 签名、JWT 令牌验证等场景。
能,前提是双方用完全相同的密钥、相同的消息内容、相同的哈希算法(如 SHA256)以及相同的输出格式(十六进制小写还是 Base64)。本工具默认输出 16 进制小写字符串,如果对方服务器要求 Base64 格式,你需要手动转换。另外注意消息内容不能有多余的空格或换行,否则 HMAC 值会完全不同。建议先在本地用简单字符串测试两边是否一致。
这是 HMAC 的正常特性。HMAC 算法在内部会先对密钥做两次哈希处理(如果密钥长度超过块大小还会先压缩),然后与消息进行两次异或和哈希运算。密钥的任何一位变化,都会导致中间结果完全不同,最终输出的 HMAC 值相差很大。这种雪崩效应正是 HMAC 能防止伪造的关键——攻击者无法通过观察新旧结果的关系来推断新密钥。
支持。本工具接收的是原始字符串,中文、日文、标点符号、空格等 UTF-8 字符都可以直接输入。但注意:不同系统对字符串编码的处理可能不同(UTF-8 vs GBK),如果你在 A 系统用中文密钥生成的 HMAC,在 B 系统验证时可能因为编码不一致而导致失败。建议统一使用 UTF-8 编码,或者将消息和密钥先转成十六进制后再计算 HMAC 以确保一致性。
SHA256 更安全。MD5 已被证明存在碰撞漏洞(不同数据能算出相同哈希),虽然 HMAC 结构能缓解部分风险,但业界已不再推荐 MD5 用于新系统。SHA256 输出 256 位,抗碰撞和抗穷举能力远强于 MD5(128 位)。如果你对接的系统支持,优先选 HMAC-SHA256 或 HMAC-SHA512。本工具同时提供这四种算法,你可以根据对方接口要求选择。
只需要发送消息原文和对应的 HMAC 值,绝对不要发送密钥。对方服务器已经预先存有相同的密钥,收到消息和 HMAC 后,会用自己保存的密钥重新计算 HMAC,如果两个值一致则验证通过。密钥通常通过线下(如当面、加密邮件、密钥管理服务)提前协商好,不能通过同一个网络通道传输。如果密钥泄露,攻击者可以伪造任意消息的 HMAC。
本工具完全在浏览器本地运行(FE 实现),你的密钥、消息和生成的 HMAC 值都不会离开你的设备。你输入的所有内容只经过浏览器的 JavaScript 引擎计算,不经过任何后端服务器。即使断网也能正常使用。如果你处理的是敏感数据(如 API 密钥、数据库密码),可以放心使用本工具,不会留下网络日志或服务器缓存。
最常见的原因是密钥或消息的编码差异。比如 Python 的 hmac 模块默认处理 bytes,如果你传入的是字符串,Python 会用默认编码(UTF-8)转成 bytes,而本工具也使用 UTF-8 编码。但如果你在 PHP 中使用 bin2hex 时多加了换行,或者在线工具自动对消息做了 trim 去空格,都会导致结果不同。建议将消息和密钥都用十六进制表示后再计算,并确认输出格式一致(十六进制小写/大写/Base64)。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。