HMAC-SHA256ジェネレーター
メッセージと秘密鍵からHMAC-SHA256署名を作成します。両方をUTF-8にエンコードし、SHA-256を使ってRFC 2104のHMAC方式を適用して、256ビットのタグを16進数またはBase64で返します。開発者は、Stripe、GitHub、SlackなどのサービスのWebhook署名のデバッグ、APIリクエストへの署名、自分のコードとの結果比較に利用できます。鍵が返されたり、ログに記録されたりすることはありません。
よくある質問
HMAC-SHA256とは何ですか?
HMAC-SHA256は、SHA-256と秘密鍵を使って作るメッセージ認証コードで、RFC 2104で定義されています。鍵を持つ人だけが、メッセージに対する正しいタグを計算できます。結果は32バイト、つまり16進数で64文字です。
Webhook署名を検証するにはどうすればよいですか?
リクエスト本文の正確な生データをメッセージとして貼り付け、署名用の秘密鍵を鍵として入力し、結果を署名ヘッダーと比較してください。多くのサービスでは、Stripeのタイムスタンプ、ドット、本文の組み合わせなどに署名します。各サービスのドキュメントに従ってメッセージを組み立ててください。1バイトでも変わると、タグも異なります。
既知のテストベクトルはありますか?
RFC 4231のテストケース2では、鍵Jefe、メッセージwhat do ya want for nothing?に対し、5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843が期待されます。このツールはまったく同じ値を返します。
鍵とメッセージはどのようにエンコードされますか?
どちらもUTF-8テキストとしてエンコードされます。一部のサービスのように秘密鍵が16進数やBase64で示されている場合、実際のバイト列は表示されたテキストとは異なるため、まず自分のコードで鍵をデコードする必要があります。どちらのフィールドも、空白や改行は計算に含まれます。
秘密鍵は保存されますか?
いいえ。鍵はリクエスト中にタグを計算するためだけに使われます。レスポンスに含まれず、ログにも記録されず、保存もされません。
鍵は空でも、非常に長くても使えますか?
HMACでは、空の鍵を含め、任意の長さの鍵を使用できます。64バイトを超える鍵は、RFCの規定どおり、まずSHA-256でハッシュされます。実際に使用する場合は、32バイト以上のランダムな鍵を選んでください。
16進数とBase64のどちらを選ぶべきですか?
相手側が送る形式を使ってください。GitHubとStripeは16進数を使います。Slackは16進数の前にv0=を付け、多くのAWSベースおよびJWTベースのシステムはBase64を使います。どちらも同じ32バイトを表します。
HMAC-SHA256は、鍵とメッセージを連結してSHA-256を適用したものと同じですか?
いいえ。HMACは内部用と外部用のパディング済み鍵を使ってメッセージを2回ハッシュし、長さ拡張攻撃を防ぎます。鍵とメッセージを連結して1回だけハッシュすると、異なるうえに安全性の低い結果になります。
コードで署名を比較するにはどうすればよいですか?
Node.jsのcrypto.timingSafeEqualやPythonのhmac.compare_digestなど、定時間比較関数を使ってください。通常の文字列比較では、期待されるタグに関するタイミング情報が漏れる可能性があります。
メッセージの最大サイズはいくつですか?
メッセージと鍵を合わせて、最大5 MiBのテキストを使用できます。一般的なWebhookペイロードやAPIリクエストには十分なサイズです。