元のボディと署名シークレットを貼り付けて HMAC 署名を生成または検証します。GitHub と Stripe の形式に対応し、一致してもタイムスタンプの新しさや再生は検査しません。
ブラウザ内でローカルに実行Enter a secret and payload to generate a signature.
Generate a signature to see the corresponding request header.
Generate a signature to see Node.js and PHP verification patterns.
Webhook の検証は、検証前にミドルウェアが本文をパースまたは再整形すると失敗します。生の本文を保持し、プロバイダーが文書化した署名入力を適用し、サーバーコードでタイミングセーフな比較を使用してください。このページはペイロードやシークレットをどこにも送信しません。
貼り付けたボディをそのまま HMAC-SHA-256 / SHA-384 / SHA-512 で署名し、GitHub の X-Hub-Signature-256 と Stripe の v1 形式を再現して、受信した署名を同じシークレットでバイト単位に照合します。
計算はこのタブの Web Crypto で行います。ボディ、シークレット、署名はブラウザー内に留まり、一致が確認できるのはバイトであってイベントの新しさではありません。
汎用 HMAC は生のボディを署名します。GitHub は同じボディを署名し、X-Hub-Signature-256 に sha256=<16進> を送ります。Stripe は「<タイムスタンプ>.<ボディ>」を署名し、Stripe-Signature に t=<タイムスタンプ>,v1=<16進> を送ります。
Stripe のヘッダーを貼り付けた場合、署名対象に使うのはヘッダー内の t です。タイムスタンプ欄はヘッダーに t= がないときだけ参照します。シークレットのローテーションで v1 が複数ある場合は、どれか一致すれば検証成功です。
テキスト欄では貼り付けた CR / CRLF が LF に変換されます。送信側が CRLF バイトで署名している場合は「CRLF 改行で署名する」をオンにすると、計算前に各 LF を CRLF に戻します。
わずかな文字の違いも影響します。JSON の再シリアライズ、末尾改行の削除、空白の変更、URL コンポーネントのデコード、パース済みボディの使用は別のダイジェストになります。ヘッダーの16進部分だけをコピーすると sha256= や v1= の接頭辞が欠けますが、このツールはどちらも受け付けます。
検証は HMAC のバイトを比較するだけです。古いタイムスタンプや再生イベントを拒否せず、プロバイダーの許容時間も判定せず、送信側へ通信しません。
汎用 Webhook では base64 を受け付けますが、GitHub と Stripe は 16 進数を送るため、この 2 つに base64 検証は用意していません。漏れたシークレットのローテーションや失効はサーバー側の作業です。