← 所有工具 用 DevToys 离线校验
我们的笔记
用 DevToys 离线校验 X-Device-Signature
有时你想校验一个 webhook 签名,又不想把 signing secret 贴进任何网站。DevToys 是一个完全离线运行的桌面工具箱——密钥永远不离开你的机器。
DevToys 是什么
DevToys 是一把离线的"开发者瑞士军刀"——一个桌面应用,把各种 generator、converter、encoder 打包在一起,省得你为它们各开一个网页工具。这里我们关心的是它的 HMAC generator。
为什么对 signing secret 来说离线很重要
UnifyPort 的 webhook 签名是一段以你的 signing_secret 为密钥的 HMAC。网页版哈希工具很方便,但要你把密钥贴进页面。DevToys 一切都在本地算——什么都不往外发——所以当密钥是你真在用的那把时,它是更稳妥的选择。
在 DevToys 里校验 X-Device-Signature
UnifyPort 对每条投递这样签名:
X-Device-Signature = hex( HMAC-SHA256( secret, timestamp + "." + raw_body ) )
想用手复现它:
- 1. 打开 DevToys 的 HMAC generator,把哈希函数设为
SHA256。 - 2. 把你的 signing secret 以纯 UTF-8 文本贴进 key 字段。
- 3. 在输入里精确粘贴
<timestamp>.<raw_body>——也就是X-Device-Timestamp的值、一个 ASCII 点、再加上原始 body 字节: - 4. 把小写 hex 输出和
X-Device-Signatureheader 比对。逐字节一致就说明密钥、timestamp、body 全对上了。
1716800000.{"type":"message.received", … }
什么时候 CyberChef 或写代码更合适
- CyberChef。 如果你想在一个 recipe 里把多步串起来——先 base64 解码 body,再 HMAC——我们的 CyberChef 教程更灵活,代价是要贴进网页。
- 写进代码。 任何要反复做的,就在 handler 里用常数时间比较(
timingSafeEqual、hmac.compare_digest、hmac.Equal)来验——绝不要用==。
从哪里拿到输入
- 要拿到喂进去的
X-Device-Timestamp和原始 body,用 webhook.site 捕获一条投递,或用 smee.io 把它转发到 localhost。 - 更想用浏览器、还想要一份可分享的 recipe?CyberChef 教程跑的是同一套算法。
常见问题
- DevToys 支持哪些平台?
- DevToys 是一个面向 Windows 和 macOS 的离线桌面应用。当你不想把 signing secret 贴进网页表单时就用它。
- DevToys 为什么比网页版 HMAC 工具更稳妥?
- 它完全在你的机器上运行——你输入的 signing secret 永远不会发到服务器。网页工具也可能是客户端计算,但用桌面应用你不用去赌这件事。
- 我算出来的签名和 X-Device-Signature 对不上,哪里错了?
- 三个常见原因:用错了 signing secret;body 在你哈希前被改过(JSON 被重新序列化、去了空白、做了 unicode 归一化);或者 timestamp 读错了 header——只有
X-Device-Timestamp参与签名。输入必须精确是<timestamp>.<raw_body>,中间是一个真正的点。
一旦对上了
把同样的计算搬进你的 handler——Node 用 crypto.createHmac、Python 用 hmac.new、Go 用 hmac.New——并且永远用常数时间函数比较,绝不要用 ==。