如何線上驗證數位簽章
對任意酬載以公開金鑰或共用密鑰驗證 HMAC、RSA、ECDSA 簽章——適用 API 整合、JWT、webhook 除錯。

為什麼重要
廠商 webhook 開始驗簽失敗,原因幾乎永遠是:金鑰錯、演算法錯、canonical 化錯、編碼錯。不必在驗證器里到處插 console.log,可把訊息與簽章貼進已知良好的驗證器比對結果——立刻知道是程式還是訊息本身有問題。
三個實際場景
貼 JWT、公鑰,選 RS256/ES256/HS256,看「有效」或「無效」。
問題縮在 handler
用廠商公布的 RSA 公鑰確認二進位簽章。
來源可查
用密鑰對酬載簽章,與進線標頭比對。
程式路徑驗過
操作說明
開啟 簽章驗證器。
貼上訊息
被簽署的精確位元組。JWT 即
header.payload;AWS Sig V4 即 canonical string-to-sign。貼上簽章
Hex 或 Base64——依來源選。工具會嘗試常見格式自動判斷。
提供金鑰
對稱:貼密鑰字串(或 Base64/hex)。非對稱:貼 PEM 格式公鑰。
選演算法
HS256/HS384/HS512(HMAC)、RS256/RS512(RSA-PKCS1)、PS256(RSA-PSS)、ES256/ES384(ECDSA)。JWT 的 alg 名稱對應相同。
讀結果
「有效」或「無效」,無效時一行理由(演算法不符、金鑰解析錯、簽章長度錯等)。
輸入
Message: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyXzEifQ
Signature: L6S8LWkLzpcREMa8gxaaZbWwLNk0LgcBh6dRQpfIBrI
Key: MyVeryLongSharedSecretValue1234567890
Algorithm: HS256結果
Valid signature.
實用技巧
- 務必用廠商公布的參考向量測試。 多數提供已知良好的訊息+簽章對,可確認工具對其演算法處理正確。
- JWT 請複製 header 確認
alg與驗證器預期一致。 忽略未簽名 token(alg=none)——那是攻擊面。 - 新 RSA 設計優先 PSS。 PKCS#1 v1.5(RS256)仍可接受,密碼學社群較偏 RSASSA-PSS(PS256)。
- 盯緊 canonical 字串。 少一個
\n、標頭名小寫差異都會翻簽。與已知良好的封包 diff 找出差異。
常見陷阱
常見陷阱
公鑰格式錯
PEM 有 BEGIN PUBLIC KEY(SPKI)與 BEGIN RSA PUBLIC KEY(PKCS#1)。工具多可接受,但請貼公鑰(不是憑證、不是私鑰)。
常見陷阱
簽章是 Base64URL 卻當 Base64 解析
JWT 簽章用 Base64URL(無補位、-_ 字母表)。輸入編碼要設對或手動正規化。
常見陷阱
演算法名稱不一致
OpenSSL 的 sha256WithRSAEncryption 對應 JWT 的 RS256。下拉里選對別名。
何時不適合用這套
- 簽發憑證屬 OpenSSL 或你的 CA。
- 驗證 TLS 伺服器憑證是瀏覽器工作;鏈驗證邏輯遠比單一簽章檢查複雜。
- 平台二進位簽章(Windows Authenticode、Apple Developer ID)需平台專用工具。
FAQ
能在這裡驗 Stripe/GitHub webhook 嗎?
可以。用 HS256(HMAC-SHA-256)、控制台儲的密鑰、原始 body 字串、標頭值當簽章。結果可判是否遭竄改。
支援 Ed25519 嗎?
Ed25519 驗證在路線圖。現階段請用 openssl pkeyutl -verify 等 CLI。
金鑰會送伺服器嗎?
不會。WebCrypto 本機執行;金鑰不離開瀏覽器行程。