このツールとは?
HMAC は Hash-based Message Authentication Code の略です。秘密鍵とメッセージを SHA-256 のような標準的なハッシュ関数と組み合わせ、固定長のダイジェストを生成します。同じ鍵と同じメッセージを持つ者であれば誰でも同一の HMAC を計算できますが、鍵を知らなければ、使われているハッシュアルゴリズムがわかっていたとしても、メッセージに対する正しい HMAC を作ることは計算量的に事実上不可能です。
これが単なるハッシュとの決定的な違いです。MD5 や SHA-256 のような単純なハッシュは入力としてメッセージしか受け取らないため、誰でも計算でき、誰が作成したかは何も証明しません。HMAC はメッセージ「と」秘密鍵の両方を入力とするため、正しい HMAC が存在すること自体が、送信者がその秘密鍵を保持していたことの証明になります。つまり整合性チェックではなく、認証の仕組みなのです。
HMAC は NIST の FIPS 198-1 で正式に標準化されており、インターネットプロトコル向けには IETF RFC 2104 で定義されています。このツールはブラウザネイティブの Web Crypto API(HMAC アルゴリズムを指定した `crypto.subtle.sign`)を使って計算しており、自前実装の JavaScript ではなく RFC 2104 を正しく実装したエンジンで動作します。
なぜこれを使うのか?
- Stripeから届いたWebhookのX-Stripe-Signatureヘッダーが本当に正しい署名なのか、サーバーのログを疑う前に手元で再現して確認したいとき――秘密鍵とペイロードをこのツールに入力し、生成されたHMAC-SHA256がヘッダーの値と一致するか照合できます。
- GitHub Appsのwebhook実装をローカルで書いていて、X-Hub-Signature-256の検証ロジックが正しく動いているか確信が持てないとき――既知のペイロードと秘密鍵で期待値を先に計算しておき、自作コードの出力と突き合わせてデバッグできます。
- 社内APIの署名付きリクエストを別チームのAPIクライアントが正しく実装できているか確認する必要があるとき――同じ秘密鍵とメッセージを渡して、双方が同じHMACを得られるかその場で検証できます。
- JWTのHS256署名部分が期待通りかを、ライブラリのブラックボックスに頼らず自分の目で確認したいとき――ヘッダーとペイロードを結合した文字列をメッセージ欄に入力し、署名鍵でHMAC-SHA256を計算して照合できます。
- 本番環境の秘密鍵を使ったテストを外部サービスに一切送信せずに行いたいとき――計算はすべてブラウザ内で完結するため、実際のシークレットを入力しても外部に漏れる心配がありません。
- SHA-1とSHA-256でHMACの出力長がどれだけ変わるかを、ドキュメントを読むより先に実際の数値で確かめたいとき――同じ鍵とメッセージに対する4種類のアルゴリズムの結果を一度に並べて比較できます。
使い方
- 「Secret Key」欄に秘密鍵を入力します。
- 「Message」欄に認証したいメッセージを入力します。
- HMAC-SHA1、HMAC-SHA256、HMAC-SHA384、HMAC-SHA512 の結果が即座に生成されます(利用先のシステムが大文字を想定している場合は「Uppercase output」にチェックを入れてください)。
- 必要な HMAC の横にある「Copy」をクリックします。
例
入力
Secret Key: key
Message: The quick brown fox jumps over the lazy dog出力
HMAC-SHA256: f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8
HMAC-SHA1: de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9これは公開されている標準的なテストベクタです。鍵に「key」、メッセージにこの文字列を使えば、正しく実装されたどのツールでも HMAC-SHA256 と HMAC-SHA1 は必ずこの値になるため、本ツールの出力を独立に検証できます。
HMACと単なるハッシュ:鍵が必要になるのはどんなときか
判断基準となるのは、「このダイジェストを誰が作成したかを証明する必要があるのか、それとも内容が変化していないことだけを確認できればよいのか」という点です。ダウンロードしたファイルが公開元のリストと一致するかを確認する、レコードの重複を排除するといった、公開のチェックサムで十分な用途であれば、単なるハッシュで問題なく、鍵なしで誰でも検証できます。一方、特定の秘密鍵を保持する者だけがそのダイジェストを作成できることを証明する必要がある場合——API 呼び出し元の認証、Webhook 送信元の信頼確認など——には HMAC が必要です。単なるハッシュでは、秘密を持たない攻撃者でも正規の送信者と同じように有効なダイジェストを偽造できてしまうからです。
4つのHMACアルゴリズムの比較
4つとも RFC 2104 で定義された同じ HMAC の構成を使っており、違いは基盤となるハッシュ関数、つまり出力長だけです。
| アルゴリズム | 出力サイズ | 主な用途 |
|---|---|---|
| HMAC-SHA1 | 160ビット(16進数40文字) | レガシーAPI、古いOAuth 1.0a署名 |
| HMAC-SHA256 | 256ビット(16進数64文字) | APIリクエスト署名、JWT HS256、Webhook検証 |
| HMAC-SHA384 | 384ビット(16進数96文字) | より長い出力が求められる高信頼性の署名 |
| HMAC-SHA512 | 512ビット(16進数128文字) | 高セキュリティ用途向けの最大長ダイジェスト |
よくある使い方
- 共有秘密で送信APIリクエストに署名し、サーバー側が呼び出し元の身元を検証できるようにする。
- 受信したWebhookペイロードを検証する(Stripe-Signature、GitHub の X-Hub-Signature-256 などのヘッダーはいずれも HMAC-SHA256 を使用)。
- HS256/HS384/HS512 で署名された JWT の署名部分を生成・検証する。
- デプロイ前に、サーバー側またはクライアント側の HMAC 実装が期待する出力と一致するかをテストする。
Webhook署名を検証する際の注意点
多くのサービスは、署名対象の文字列としてリクエストボディをそのまま使うわけではなく、タイムスタンプなど他の要素と連結した文字列に対してHMACを計算します。たとえばStripeはタイムスタンプとペイロードを特定のフォーマットで結合してから署名するため、このツールで再現検証する際は、実際に送信元がどの文字列に対して署名しているのかをそのサービスのドキュメントで確認する必要があります。
また、リクエストボディがJSONの場合、パース後に再シリアライズすると改行やキーの順序が変わり、元のバイト列と一致しなくなることがよくあります。検証時は必ず「受信した生のリクエストボディ」をそのままメッセージ欄に貼り付けてください――パース・整形後の文字列を使うと、正しい実装でも一致しない結果になります。
よくある質問
HMACとは何ですか?
HMAC(Hash-based Message Authentication Code)は、秘密鍵とメッセージをハッシュ関数で組み合わせて、メッセージの完全性と送信者がその鍵を保持していることの両方を証明するダイジェストを生成する仕組みです。NIST FIPS 198-1 および IETF RFC 2104 で定義されています。
HMACと単なるハッシュの違いは何ですか?
単なるハッシュ(SHA-256、MD5 など)はメッセージのみを入力とするため誰でも計算でき、メッセージが壊れていないことしか証明できず、誰が送ったかは証明できません。HMAC はメッセージに加えて秘密鍵を入力とします。特定の秘密鍵を保持する者からメッセージが送られたことを証明する必要がある場合(API 署名、Webhook の送信元検証など)は HMAC が必要です。ファイルやメッセージが変化していないことだけを確認したく、作成者の証明が不要であれば、単なるハッシュで十分です。
秘密鍵はサーバーに送信されますか?
送信されません。このツールは Web Crypto API を使い、HMAC の計算をすべてブラウザ内で完結させます。鍵とメッセージがどこかに送信されることはないため、実運用の秘密情報を使ったテストも安全に行えます。
SHA-1、SHA-256、SHA-384、SHA-512 のどれを使えばいいですか?
特定のシステムが別のものを要求していない限り、HMAC-SHA256 を使ってください。AWS、Stripe、GitHub の Webhook をはじめとする多くの最新 API で使われている事実上の標準であり、十分なセキュリティマージンを備えています。HMAC-SHA1 は古い OAuth 1.0a 実装のようなレガシーシステムでは今も使われていますが、基盤となる SHA-1 自体は脆弱とみなされています。HMAC-SHA384/512 は、より長い出力や追加のセキュリティマージンが特に求められる場合に使用します。
SHA-1自体が破られているなら、HMAC-SHA1も危険なのでは?
2017年に実証された SHA-1 への衝突攻撃は、単なるハッシュ関数としての SHA-1 を破ったものです。HMAC のセキュリティは衝突耐性に同じようには依存しないため、HMAC-SHA1 は今も暗号学的に健全とみなされています。とはいえ、新規システムでは HMAC-SHA256 以上を選ぶのが望ましいでしょう。実用上のデメリットは特になく、この議論自体を避けられます。
HMACの実際の利用例にはどんなものがありますか?
REST API リクエストに署名し、呼び出し元が共有 API シークレットを保持していることをサーバーが検証できるようにする用途。Stripe、GitHub、Shopify などのサービスからの Webhook ペイロードを検証し、正規のリクエストであり偽造されていないことを確認する用途。二要素認証向けの時間ベースワンタイムパスワード(TOTP/HOTP)の生成。HS256/HS384/HS512 アルゴリズムを使った JWT トークンの署名などが挙げられます。
同じ鍵とメッセージなら、このツールと自作コードのHMACは必ず一致しますか?
はい。HMACはRFC 2104で厳密に定義されたアルゴリズムなので、同じハッシュ関数(例えばSHA-256)、同じ鍵、同じメッセージを使えば、正しく実装されたどの言語・どのライブラリでも必ず同一の出力になります。一致しない場合は、鍵やメッセージのエンコーディング(UTF-8かどうか、余分な改行がないかなど)にズレがある可能性が高いです。
鍵にはどんな文字列を使えばいいですか?長さの制限はありますか?
HMACの鍵に長さの上限はなく、短い文字列から長いランダム文字列まで使用できます。ただし短すぎる鍵はセキュリティを弱めるため、実運用ではSHA-256の場合32バイト(256ビット)程度のランダムな鍵を使うのが一般的な推奨です。このツール自体はテスト・検証目的なので、任意の文字列を鍵として入力して構いません。
Uppercase outputのチェックボックスは何のためにありますか?
HMACの出力は本来16進数の小文字(0-9、a-f)で表示されますが、連携先のシステムやAPIによっては大文字の16進数表記(0-9、A-F)を期待する場合があります。このチェックボックスをオンにすると、値そのものは変えずに表示形式だけを大文字に切り替えられます。
メッセージに日本語などマルチバイト文字を含めても正しく計算されますか?
はい。このツールはメッセージをUTF-8としてエンコードしてからHMACを計算するため、日本語を含む任意のUnicode文字列を入力しても問題なく処理できます。ただし、連携先のシステムが異なるエンコーディングを使っている場合は、事前にエンコーディングの一致を確認してください。