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