HMAC ジェネレーター&署名検証ツール
無料のオンライン HMAC 生成・検証ツール。Text・Hex・Base64 の鍵で HMAC-SHA256/SHA1/SHA384/SHA512 を計算し、Hex/Base64/Base64URL で出力します。100% ブラウザ内で完結 —— 鍵はページから外に出ません。
HMAC とは?
HMAC(ハッシュベースのメッセージ認証コード)は、メッセージが改変されておらず真正であること —— つまり共有秘密鍵を持つ者によって生成されたこと —— を証明する、短い固定長のタグです。RFC 2104 と FIPS 198-1 で定義され、HMAC は任意の暗号学的ハッシュ関数を秘密鍵と特定のネスト構造で組み合わせます。これは HMAC(K, m) = H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ m)) と書かれます。内側のハッシュは鍵をメッセージに束縛し、外側のハッシュがその結果を包みます。これこそが、裸の SHA-1 や SHA-256 関数に影響する長さ拡張攻撃に HMAC が耐性を持つ理由です。
HMAC は現代の Web インフラのいたるところにあります。webhook に署名し、受信したリクエストが本当に GitHub、Stripe、Slack、Twilio から来たもので偽造ではないと確認できるようにします。API リクエストに署名し(AWS Signature Version 4 は HMAC-SHA256 の上に構築されています)、サーバーがパスワードを回線上で送ることなく呼び出し元を認証できるようにします。HS256 の「S」はこれです:HS256 で署名された JWT はヘッダーとペイロードに対する HMAC-SHA256 を伴い、JWT エンコーダーで確認できます。さらに TLS の鍵導出(HKDF)、ワンタイムパスワードアルゴリズム(HOTP/TOTP)、数えきれない内部サービスのメッセージ完全性も支えています。
本ツールは Web Crypto API の crypto.subtle.sign('HMAC', ...) を使い、完全にブラウザ内で HMAC を計算します —— ブラウザが TLS ハンドシェイク中に使うのと同じプリミティブです。あなたの秘密鍵とメッセージは決してアップロードされないため、本番の署名シークレットでも安全です。同じシークレットを生のテキスト、hex、base64 として表現できるため、ツールでは「鍵のエンコーディング」を明示的に選べます。また、プロバイダーごとにタグの形式が異なるため、Hex、Base64、Base64URL で出力できます。「検証」タブでは受信した署名を確認でき、定数時間比較を用いるためチェック自体がタイミング情報を漏らしません。
const crypto = require('crypto');
// HMAC-SHA256 with a UTF-8 text key, hex output
const hmac = crypto
.createHmac('sha256', 'my-secret-key')
.update('Hello, World!')
.digest('hex');
console.log(hmac);
// → 'cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699'
// Verify a signature in constant time
function verify(message, key, expectedHex) {
const actual = crypto.createHmac('sha256', key).update(message).digest();
const expected = Buffer.from(expectedHex, 'hex');
return actual.length === expected.length &&
crypto.timingSafeEqual(actual, expected);
} 主な機能
1 つのツールで生成と検証
「生成」タブで署名を生成するか、「検証」タブに「期待される HMAC」を貼り付けて、受信した webhook やトークンを認証します。検証は定数時間比較を用いるため、結果がタイミング情報を漏らすことはありません。
鍵のエンコーディングを選べる
シークレットを Text(UTF-8)、16 進数、Base64 のいずれかとして解釈します。これは他のほとんどのツールが省く設定であり —— 同じ鍵に対して 2 つのシステムが異なる HMAC を計算する最も一般的な原因です。
3 つの出力エンコーディング
タグを Hex(GitHub webhook、AWS)、Base64(Stripe、Twilio、多くの API)、Base64URL(JWT や URL セーフトークン)で出力でき、手動変換なしで連携先に合わせられます。
4 つのネイティブアルゴリズム
デフォルトの HMAC-SHA256 に加え、SHA-1、SHA-384、SHA-512。すべてブラウザの Web Crypto API 上で動くため、信頼すべき JavaScript の暗号ライブラリも、性能上のペナルティもありません。
100% クライアントサイドでプライベート
あなたの秘密鍵とメッセージは完全にブラウザ内で処理され、どのサーバーにも送信されません。ネットワークタブを開けば外向きのリクエストがゼロであることが分かります —— 本番の署名シークレットでも安全です。
リアルタイム計算
メッセージ、鍵、エンコーディング、アルゴリズムを編集すると HMAC が即座に再計算されます —— 「生成」ボタンの往復がないため、あなたの値がサーバーのものと一致するまでエンコーディングを試せます。
テスト済みベクトルに基づく
出力は公式の RFC 4231 HMAC テストベクトルに対して検証されているため、ダイジェストが OpenSSL、Node の crypto モジュール、Python の hmac ライブラリの生成物と一致すると信頼できます。
HMAC の例
クイックスタート —— HMAC-SHA256、Hex 出力
Hello, World!
cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699
鍵 "my-secret-key"(鍵のエンコーディング = Text)、アルゴリズム HMAC-SHA256、出力フォーマット = Hex のとき、メッセージ "Hello, World!" は cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699 を生成します。これは Node の crypto.createHmac('sha256', key).update(msg).digest('hex') が返す標準的な 64 文字の 16 進ダイジェストです。
Stripe 形式の webhook を検証(Base64 出力)
{"id":42,"event":"user.created"} Cd2f7zTKaJFeG6k+t1FcvDPn51OAZ2f4GrxkCUgMhGs=
多くの webhook プロバイダーは署名を Base64 で送信します。鍵 "whsec_test_secret"(Text)、HMAC-SHA256、出力フォーマット = Base64 のとき、この JSON ボディは Cd2f7zTKaJFeG6k+t1FcvDPn51OAZ2f4GrxkCUgMhGs= に署名されます。その値を「検証」タブに貼り付け、処理する前にリクエストが本当にプロバイダーから来たことを確認してください。HMAC は内部で、当社の SHA-256 ハッシュジェネレーターと同じプリミティブの上で動きますが、あなたの秘密鍵で鍵付けされています。
RFC 4231 リファレンスベクトル
what do ya want for nothing?
5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843
これは公式の HMAC テストベクトル文書である RFC 4231 のテストケース 2 です。鍵 "Jefe"(Text)、HMAC-SHA256、Hex 出力のとき、メッセージ "what do ya want for nothing?" は 5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843 を生成します。この正確な値に一致することが、HMAC 実装が正しいと証明する方法です。
より長いダイジェストのための HMAC-SHA512
The quick brown fox
36f44b125a8a90639dc46733039571792e081e0fd8685ff746784b02ed14aa35629d562c7117cde4a701570551faa5a5e1b7ef1eb5c3bcd4cc1fdb8923fcf14e
アルゴリズムを HMAC-SHA512 に切り替えると 128 文字(512 ビット)のダイジェストが得られます。鍵 "key"(Text)と Hex 出力のとき、"The quick brown fox" は上記の値を生成します。SHA-512 はほとんどの 64 ビットハードウェアで SHA-256 より高速で、出力も大きくなりますが、相互運用のデフォルトは依然として SHA-256 です。
HMAC を生成・検証する方法
- 1
アルゴリズムを選ぶ
HMAC-SHA256(デフォルトで、ほぼすべての webhook、API、JWT に適した選択)を選ぶか、それを必要とするシステムに合わせて SHA-1、SHA-384、SHA-512 に切り替えます。4 つすべてが Web Crypto API を介してブラウザ内でネイティブに動作します。
- 2
秘密鍵を入力しエンコーディングを設定する
秘密鍵を入力または貼り付け、サーバーの解釈方法に合わせて「鍵のエンコーディング」を設定します:普通の文字列なら Text(UTF-8)、16 進のバイト列なら Hex、base64 のシークレットなら Base64 です。これを誤ることは HMAC 不一致の最大の原因なので、迷ったら 3 つすべて試してください。
- 3
メッセージを入力する
署名したい正確なバイト列を貼り付けます —— webhook の場合は、再シリアライズや空白の変更を一切行わない、バイト単位で生のリクエストボディです。HMAC は編集に応じてその場で再計算され、サーバーには何も送信されません。
- 4
出力フォーマットを選んでコピーする
Hex(GitHub 形式)、Base64(Stripe/AWS 形式)、Base64URL(JWT 形式)から、連携先が期待するものに合わせて選び、「コピー」をクリックして署名を取得します。
- 5
既存の署名を検証する
「検証」タブに切り替え、ヘッダーやトークンから「期待される HMAC」を貼り付けると、ツールが計算した署名が一致するかを定数時間で確認します —— こうしてペイロードに対して行動を起こす前に認証できます。
よくある HMAC の間違い
鍵のエンコーディング不一致(不一致の最大原因)
同じシークレットは生の UTF-8 テキスト、hex、base64 として読めます —— そして各解釈は完全に異なる鍵バイトを生むため、あなたのツールとサーバーの解釈が食い違えば HMAC は一致しません。プロバイダーが hex や base64 のシークレットを渡してきたら、文字列をそのまま署名するのではなく、署名前にバイトへデコードしなければなりません。署名の検証に失敗したら、まず 3 つすべての「鍵のエンコーディング」オプションで試してください。
// Server stored a base64 secret but you sign the literal string
createHmac('sha256', 'c2VjcmV0LWtleQ==').update(msg) // Decode the base64 secret to raw bytes first
createHmac('sha256', Buffer.from('c2VjcmV0LWtleQ==', 'base64')).update(msg) 出力エンコーディング不一致
HMAC は生のバイト列であり、hex、base64、base64url は同じ値の異なるテキストエンコーディングに過ぎません。サーバーが base64 の署名を送り、あなたがそれを hex ダイジェストと比較すると、基盤のバイトが同一でも決して一致しません。「出力フォーマット」をヘッダーやトークンが使うものに合わせてください。
// Provider sends base64, you compare hex
expected = 'Cd2f7z...=' // base64
actual = digest('hex') // hex — never matches // Produce the same encoding the provider uses
actual = digest('base64') 生のボディではなく再シリアライズした JSON に署名する
webhook 署名はプロバイダーが送った正確なバイトを対象とします。JSON をパースして再文字列化すると、キー順、間隔、数値の書式が変わり、バイトが変わって署名が壊れます。常にパース前に取得した生のリクエストボディに HMAC をかけてください。
// Re-serialization changes the bytes body = JSON.stringify(JSON.parse(rawBody)) verify(hmac(body))
// Sign the raw bytes exactly as received verify(hmac(rawBody))
定数時間比較ではなく == を使う
受信した署名を == や単純な文字列の等価で比較するとタイミング情報が漏れます。比較は最初の異なるバイトで停止するからです。多数の試行を経て攻撃者は有効なタグを復元できます。検証時は必ず定数時間の等価チェックを使ってください。
if (received === computed) { /* trust */ } if (crypto.timingSafeEqual(receivedBuf, computedBuf)) { /* trust */ } HMAC の用途
- webhook 署名を検証する
- GitHub、Stripe、Slack、Twilio などのプロバイダーは、あなたとだけ共有する秘密鍵でリクエストボディに対する HMAC を使って各 webhook に署名します。タグを再計算してヘッダー(例:X-Hub-Signature-256)と比較し、行動を起こす前にイベントが本物だと確認します。「検証」タブを使えば使い捨てコードを書かずに行えます。
- API リクエストに署名する
- 認証付きの API では、シークレット自体を送る代わりに、共有シークレットでリクエスト(メソッド、パス、タイムスタンプ、ボディ)を HMAC 署名するようクライアントに求めることがよくあります。AWS Signature Version 4 が代表例です。本ツールはそれらの署名を一歩ずつ再現・デバッグできます。
- メッセージの完全性を保証する
- サービス間でトークン、cookie、メッセージを渡す際に HMAC を付与すると、受信側はあらゆる改ざんを検出できます。タグはシークレットに依存するため、攻撃者はデータを変更した後にそれを再計算できません —— 普通のチェックサムとは異なります。
- JWT の HS256 署名を理解する
- HS256 で署名された JWT は base64url(header) + '.' + base64url(payload) を HMAC-SHA256 で署名し、結果を Base64URL で出力したものに過ぎません。ここでアルゴリズムを SHA-256、出力を Base64URL に設定すると、その署名がどう生成されるかを正確に確認でき、JWT エンコーダーでクロスチェックできます。
- 一致しない署名をデバッグする
- HMAC がサーバーのものと一致しないとき、本ツールは原因を切り分ける最速の方法です:鍵を Text、Hex、Base64 で試し、出力を Hex と Base64 で切り替え、署名しているのが正確な生のバイト列であることを確認します —— すべてコードを再デプロイせずに行えます。
HMAC の仕組み
- RFC 2104 構造
- HMAC は H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ m)) と定義されます。ここで ipad は繰り返されたバイト 0x36、opad は繰り返された 0x5c で、いずれもハッシュのブロックサイズまで埋められます。ブロックサイズより長い鍵はまずハッシュされ、短い鍵はゼロ埋めされます。この 2 パスのネストこそが HMAC の安全性証明を与えており、基盤ハッシュが衝突耐性を持たなくても成立します。
- 鍵付きハッシュが普通のハッシュに勝る理由
- 普通のハッシュはデータが偶発的に破損していないことしか証明しません。誰でも任意のメッセージ(改ざんされたものを含む)に対して再計算できるからです。HMAC はシークレットを混ぜ込むため、鍵を持つ者だけが有効なタグを生成できます。これは完全性のみを完全性と真正性に変えるものであり、webhook や署名付きリクエストが実際に必要とする性質です。
- 長さ拡張への耐性
- 裸の SHA-1、SHA-256、SHA-512 は Merkle–Damgård ハッシュで、長さ拡張に対して脆弱です:H(secret ‖ msg) が与えられると、攻撃者はシークレットを知らずに H(secret ‖ msg ‖ extra) を計算できます。素朴な「シークレットプレフィックス MAC」方式はこれで破られます。HMAC の外側のハッシュがこの攻撃を無力化します。これがシークレットとメッセージを一緒にハッシュするのではなく HMAC を使う主な理由です。
- SHA-256 と SHA-512 の選択
- HMAC-SHA256 は 256 ビット(64 hex 文字)のタグを生成し、相互運用のデフォルトです —— 高速、普遍的、どこでもサポートされています。HMAC-SHA512 は 512 ビット(128 hex 文字)のタグを生成し、SHA-512 が 64 ビットワードを使うため 64 ビット CPU ではしばしば高速です。仕様や対向システムが SHA-512 を要求しない限り SHA-256 を選んでください。どちらも認証には安全です。
- Web Crypto 実装
- 本ツールは crypto.subtle.importKey を呼んで鍵を読み込み(Text、Hex、Base64 からデコード)、crypto.subtle.sign('HMAC', ...) でタグを計算し、生のバイト列を Hex、Base64、Base64URL にエンコードします。これはブラウザが TLS に使うのと同じネイティブで監査済みの実装で、速度のため JavaScript エンジンの外で動作します。
HMAC のベストプラクティス
- 鍵はハッシュ出力以上の長さにする
- HMAC-SHA256 には少なくとも 32 バイト(256 ビット)のランダムなシークレットを、SHA-512 には 64 バイトを使います。短いまたは低エントロピーの鍵は最も弱い環です。鍵は暗号学的に安全な乱数源から生成してください —— 決してパスワードや予測可能な文字列を使わないでください。
- タグは常に定数時間で比較する
- 署名は == や文字列の等価ではなく、定数時間比較(Node なら crypto.timingSafeEqual、Python なら hmac.compare_digest)で検証します。素朴な比較は最初の異なるバイトで早期に返り、攻撃者が有効なタグをバイト単位で復元できるタイミングを漏らします。本ツールの「検証」タブはすでに定数時間で比較しています。
- 秘密鍵を決してログ出力・露出しない
- 署名シークレットをログ、エラーメッセージ、URL、クライアントサイドコードから締め出してください。シークレットマネージャーや環境変数に保存し、定期的にローテーションし、各連携をそれぞれの鍵にスコープすることで、1 つの漏洩がすべてを危険にさらさないようにします。
- HMAC-SHA256 以上を優先する
- デフォルトは HMAC-SHA256 とし、対向が要求する場合は SHA-384 や SHA-512 に上げます。新しいシステムで HMAC-SHA1 は避け、HMAC-MD5 は決して使わないでください。HMAC は裸の署名より弱いハッシュを許容しますが、現代のハッシュから始めることで最大の余裕が得られます。
- タイムスタンプを含む正確なバイトに署名する
- 生の未改変のペイロードに署名します —— JSON の再シリアライズや空白の除去はバイトを変え、検証を壊します。リクエスト署名では、署名対象データにタイムスタンプや nonce を含め、古い署名を拒否してリプレイ攻撃を防ぎます。
HMAC のよくある質問
HMAC とは何ですか?
HMAC は SHA-256 のような普通のハッシュとどう違うのですか?
受信した webhook 署名はどう検証すればよいですか?
私のサーバーはどの鍵と出力エンコーディングを使っていますか?
HMAC-SHA256 は安全ですか?
なぜここに HMAC-MD5 や HMAC-SHA-3 がないのですか?
JWT には HS256(HMAC)と RS256(RSA)のどちらを使うべきですか?
関連ツール
すべてのツールを見る →Bcrypt ハッシュ生成・検証ツール
セキュリティツール
bcrypt パスワードハッシュをオンラインで生成・検証。コスト調整、$2b$/$2a$/$2y$ プレフィックス対応。100% ブラウザ内で処理し、パスワードは一切送信されません。
JWT デコーダー — オンライン解析ツール
セキュリティツール
JWTトークンを無料のJWTデコーダーでオンラインデコード。ヘッダー、ペイロード、署名、有効期限、アルゴリズム、クレームを即座に検査できます。100%ブラウザ動作 — トークンはデバイスから外に出ません。登録不要、追跡なし。
JWT エンコーダー&ジェネレーター
セキュリティツール
無料のオンラインJWTジェネレーター&エンコーダー。ヘッダーとペイロードを組み立て、HS256、RS256、ES256で即座に署名できます。100%ブラウザ動作 — シークレットと鍵はデバイスから外に出ません。
無料 JWT シークレット生成ツール — HS256/384/512
セキュリティツール
HS256/384/512 向けの強力で RFC 準拠の JWT シークレットを生成。100% ブラウザ内で処理し、サーバーには一切送信されません。base64url・base64・hex で .env 用にコピー。
MD5ハッシュジェネレーター&ファイルチェックサムツール
セキュリティツール
無料オンラインMD5ハッシュ生成ツール。ブラウザ上でMD5・SHA-256・SHA-1・SHA-512のハッシュ値を即座に生成。テキストやファイルのチェックサム検証・比較、ワンクリックコピー対応。登録不要でデータはサーバーに送信されません。
ランダムパスワード生成 — カスタマイズ可能&安全
セキュリティツール
無料のオンラインランダムパスワード生成ツール。ブラウザ上で安全な強力パスワードを即座に自動生成できます。長さや文字種のカスタマイズ、最大50個の一括生成に対応。エントロピー分析付き強度メーター搭載。データはサーバーに送信されません。