使い方
- 秘密鍵を入力し、テキストか16進数バイト列かを選択します。
- メッセージを貼り付けます。たとえば、Webhookのペイロードを受信したとおりに貼り付けます。
- サービスで使用しているアルゴリズムと出力形式を選択します。入力に応じてHMACが更新されます。
- 署名を確認するには、検証欄に貼り付けて「一致」と表示されるか確認します。
仕組み
HMAC(RFC 2104)は秘密鍵とハッシュ関数を組み合わせ、鍵を持つ人だけが生成できる署名を作成します。Webhookや署名付きAPIリクエストなどのサービスは、メッセージごとにHMACを送信し、受信側がメッセージの正当性と改ざんの有無を確認できるようにします。
このツールはブラウザーのWeb Crypto API(crypto.subtle.importKeyとsign)を使用し、RFC 4231およびRFC 2202のテストベクトルに照らして検証されています。テキスト形式の鍵とメッセージはUTF-8としてエンコードされます。16進数形式の鍵は生バイトにデコードされます。スペース、コロン、先頭の0xは無視されます。HMAC-SHA-256が最も一般的な選択肢です。HMAC-SHA-1もMACとしては現在も安全と見なされていますが、主に古いAPIで使われています。
署名が一致しない場合は、よく異なる次の点を確認してください。正確なメッセージバイト(多くのWebhookプロバイダーは再整形されたJSONではなく、生の本文に署名します)、署名対象の文字列にプロバイダーが追加するタイムスタンプやプレフィックス、鍵をテキストとして使うのか、先に16進数またはBase64からデコードする必要があるのか、期待する署名が16進数とBase64のどちらなのか。また、「sha256=」のようなプレフィックスが付いている場合は、比較する前に削除してください。
使用例
RFC 4231のテストケース
鍵「Jefe」(テキスト)、メッセージ「what do ya want for nothing?」を使ったHMAC-SHA-256の結果は、5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843です。「例を試す」を選ぶと読み込めます。
Webhook署名の検証
プロバイダーが各リクエストにX-Signature: sha256=…ヘッダーを付けて送信します。リクエスト本文をそのままメッセージとして貼り付け、Webhookのシークレットを鍵に指定し、HMAC-SHA-256とHexを選択します。次に、「sha256=」の後の値を検証欄に貼り付けます。
16進数でエンコードされた鍵
システムによっては、0b0b0b…のような16進数文字列で鍵が提供されます。デコード後のバイト列で署名するには、鍵の形式としてHexを選択してください。同じ文字列をテキストとして扱うと、結果はまったく異なります。
よくある質問
HMACと通常のハッシュの違いは何ですか?
誰でもメッセージのSHA-256などの通常のハッシュを計算できます。HMACは秘密鍵にも依存するため、鍵を持つ人だけが生成または検証できます。これにより、メッセージが鍵の所有者から送られ、改ざんされていないことを確認できます。
HMACがサーバーの値と一致しないのはなぜですか?
多くの場合、入力バイト列が異なっています。改行コード、空白、JSONキーの順序、文字エンコーディング、または16進数やBase64からデコードする必要がある鍵などを確認してください。また、同じ形式(16進数またはBase64)で比較し、「sha256=」のようなプレフィックスを削除してください。
秘密鍵が外部に送信されることはありますか?
いいえ。鍵とメッセージは、このブラウザータブ内のWeb Crypto APIでのみ使用されます。アップロード、保存、アナリティクスへの送信はされません。
HMAC-SHA-1はまだ安全ですか?
SHA-1の衝突がHMAC-SHA-1を直接破るわけではなく、互換性のため現在も使用できます。新しいシステムでは、HMAC-SHA-256以上を使用してください。
プライバシー
鍵、メッセージ、結果はこのブラウザータブ内にのみ存在します。アップロード、保存、解析への送信は行われません。ツールが使用されたことを示す匿名イベントのみ記録されます。