← 所有工具
我們的筆記

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——並且永遠用常數時間函數比較,絕不要用 ==