← 所有工具
我们的笔记

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. 1. 打开 DevToys 的 HMAC generator,把哈希函数设为 SHA256
  2. 2. 把你的 signing secret 以纯 UTF-8 文本贴进 key 字段。
  3. 3. 在输入里精确粘贴 <timestamp>.<raw_body>——也就是 X-Device-Timestamp 的值、一个 ASCII 点、再加上原始 body 字节:
  4. 4. 把小写 hex 输出和 X-Device-Signature header 比对。逐字节一致就说明密钥、timestamp、body 全对上了。
1716800000.{"type":"message.received", … }

什么时候 CyberChef 或写代码更合适

  • CyberChef。 如果你想在一个 recipe 里把多步串起来——先 base64 解码 body,再 HMAC——我们的 CyberChef 教程更灵活,代价是要贴进网页。
  • 写进代码。 任何要反复做的,就在 handler 里用常数时间比较(timingSafeEqualhmac.compare_digesthmac.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——并且永远用常数时间函数比较,绝不要用 ==