HMACジェネレーター

HMACは、ほとんどの署名付きWebhook、AWS Signature v4ヘッダー、およびJWT HS256トークンの基盤となるアルゴリズムです。メッセージと秘密鍵を入力し、ハッシュファミリーを選択すると、このジェネレータはRFC 2104で定義されている通りのHMAC値を生成します。これは、バックエンドが送信しようとしているデータを検証したり、APIから受信した署名を再現したりするのに非常に有用です。

HMACを計算する方法

  1. 1

    メッセージを貼り付ける

    署名する正確なバイト列、Webhookのペイロード、正規化されたリクエスト、または任意の文字列です。

  2. 2

    秘密鍵を入力する

    テキストまたは16進数のいずれでも構いません。ジェネレーターはRFCに従い、鍵をブロックサイズに合わせてパディングまたはハッシュ処理します。

  3. 3

    ハッシュアルゴリズムを選択する

    デフォルトはSHA-256です。旧システムとの互換性が必要な場合は、SHA-1、SHA-384、SHA-512またはMD5を選択してください。

  4. 4

    署名をコピーする

    出力は小文字の16進数形式で、Webhook設定やAuthorizationヘッダーにそのまま貼り付けられます。

HMACの内部構造

HMACは、通常のハッシュ関数を鍵付きの構造で包み込むことで、鍵がなければ署名を偽造できないようにします。

RFC 2104のレシピ

HMAC(k, m) = H((k' ⊕ opad) ∥ H((k' ⊕ ipad) ∥ m))

ここで、k'はハッシュのブロックサイズに合わせてパディングされた鍵であり、opad = 0x5c repeatedipad = 0x36 repeatedはパディング定数です。

アルゴリズムの選択

アルゴリズム ブロックサイズ 出力長 推奨用途
HMAC-SHA-256 64バイト 32バイト 現代の標準、Webhook署名
HMAC-SHA-384 128バイト 48バイト 高セキュリティなAPI署名
HMAC-SHA-512 128バイト 64バイト 長寿命トークン
HMAC-SHA-1 64バイト 20バイト レガシー(AWS S3 v2、OAuth 1.0)
HMAC-MD5 64バイト 16バイト レガシー用途のみ;新規開発では避けること

HMACが登場する場面

  • GitHub、Stripe、ShopifyのWebhook:ヘッダーX-Hub-Signature-256Stripe-Signatureなど。
  • AWS Signature v4:正規化されたリクエストに対して連鎖的に適用されるHMAC-SHA256。
  • JWT HS256:トークンの署名はHMAC-SHA-256(header.payload, secret)です。
  • パスワードリセットトークン:user_id、有効期限、およびサイトの秘密値を組み合わせたHMAC。

よくある間違い

  • 16進エンコードされた鍵を、まずバイト列にデコードせずにテキストとして渡す。
  • 誤ったペイロードのバイト列に署名する:一部のWebhookは空白文字を含む生のリクエストボディに署名し、他のWebhookは正規化された形式に署名します。
  • 署名の比較にJavaScriptやPythonの==を使う;タイミング攻撃を防ぐため、常にタイミングセーフな比較を使用してください。

よくある質問

ほとんどの場合、メッセージのバイト列が異なるためです。JSONとしてパースされたボディに署名すると空白文字が変わってしまうため、生のリクエストボディに署名してください。また、両側で鍵が同じ方法(16進数か生のバイト列か)でデコードされているかを確認してください。

はい。鍵の長さがハッシュブロックサイズより小さい場合はゼロで補充され、長い場合はまずハッシュ処理されます。RFC 2104では、出力の長さ(SHA-256では32バイト)以上の鍵を使用することを推奨しています。

HMACは、その攻撃がHMACの構成には引き継がれないため、既知のMD5衝突攻撃に対して依然として耐性があります。ただし、新しいコードにはHMAC-SHA-256を使用してください。ツールや監査担当者はこれを前提としています。

はい。HMACを計算するために、メッセージと秘密鍵は暗号化されたHTTPS接続で当サーバーに送信されます。計算にのみ使用され、保存や記録はされません。

関連ツール

このツールは他の言語でも利用できます