HMAC 計算・署名検証ツール

HMAC-SHA256・SHA-512・SHA-1・MD5 をブラウザで計算。鍵はテキスト・16 進数・Base64 に対応。LINE や Chatwork の Webhook 署名を貼り付けて照合し、一致しない原因も表示します。

  • ブラウザ内で処理
  • データはブラウザ外に出ません
  • 無料 · 登録不要
「カスタム HMAC」は任意の鍵とメッセージで計算し、アルゴリズムも選べます。ほかの形式は各サービスのドキュメントどおりに署名対象の文字列を組み立て、アルゴリズムを固定し、そのサービスが使うヘッダーやパラメーターの形で「送信する値」の行を追加します。Feishu・DingTalk・NAVER Cloud は自分が送るリクエストに署名する形式なので、ボディの入力欄はありません。「例」は公式ドキュメントに載っているテストデータを入力します。データのある形式でだけ表示されます。
ビット HMAC の左端から指定したビット数だけを残します(RFC 2104 §5)。3 つの表記すべてに反映されます。8 の倍数で、8 から全長までの値を入力します。空欄なら全長です。出力の半分未満、または 80 ビット未満のときは注意を表示します。「カスタム HMAC」でだけ使えます。

署名するバイト列です。「カスタム HMAC」ではテキスト(UTF-8 で符号化)・16 進数・Base64 を選べます。ほかの形式は受信したリクエストボディをテキストとして扱います。テキスト欄の改行はすべて LF になるので、送信側が CRLF なら CRLF を選びます。16 進数にはスペース、コロン、先頭の 0x があっても読めます。Base64 は標準と URL セーフのどちらの文字でも、パディングの有無にかかわらず読めます。16 進数と Base64 では、IME で入った全角文字を半角として読みます。Shift_JIS・GBK・EUC-KR のテキストは 16 進数で貼り付けてください。
「カスタム HMAC」では鍵をテキスト(UTF-8)・16 進数・Base64 から選べます。ほかの形式は各サービスの決まりどおりに読みます。多くはテキストのまま使い(Stripe は whsec_ も含めます)、Chatwork は Base64 デコードし、Standard Webhooks は whsec_ の後ろを Base64 デコードします。鍵がハッシュのブロック長(64 バイト。SHA-384 と SHA-512 は 128 バイト)より長いと HMAC は先に鍵をハッシュし、短いと 0 で埋めます(RFC 2104)。ブロック長より長い鍵と出力長より短い鍵には注意を表示します。テキストの鍵の前後にあるスペースも鍵に含まれます。
結果 入力に合わせて更新されます。Hex・Base64・Base64url は同じバイト列の 3 つの表記です。サービスの形式で追加される「送信する値」は、そのサービスが実際に使うヘッダーやパラメーターの形です。「署名対象の文字列」は HMAC に入った文字列そのもので、改行とタブを記号で表示します。ツール内にフォーカスがあるときに Ctrl+L(Mac は ⌘+L)を押すと、テキスト欄を空にします。

鍵かメッセージを入力すると、ここに HMAC が表示されます。

受け取った署名を貼り付けます。sha256=…、t=…,v1=…、v1,… のようなヘッダー、sign=… を含む DingTalk の URL、16 進数や Base64 の値だけでも読めます。バイト列で比較するので、16 進数(大文字でも小文字でも)と Base64 のどちらでも構いません。切り詰めた値は 10 バイト以上あれば先頭一致で判定します。一致しないときは、よくある原因(末尾の改行、CRLF、前後のスペース、JSON の整形、鍵のエンコード、鍵とメッセージの入れ違い、別のアルゴリズム)を 1 つずつ試し、貼り付けた値になる最初の原因を表示します。サーバーでは定数時間で比較してください。

鍵・メッセージ・署名はこのタブの中で Web Crypto API により計算します。送信も保存もせず、再読み込みすると消えます。

詳しいガイドを読む HMACとは?HMAC-SHA256の仕組みと署名検証の実例
例・詳しい説明・よくある質問 実際の出力つきの例、ほかのツールとの違い、よくある質問。

計算は RFC 2104 の定義どおりです。鍵がブロック長(SHA-256 は 64 バイト、SHA-512 は 128 バイト)を超えると先にハッシュし、出力長より短い鍵には注意を表示します(RFC 2104 §3 は推奨していません)。

LINE の公式例で確かめる

LINE Developers の「Webhookの署名を検証する」には、検証ボタンで届くボディ、チャネルシークレット 8c570fa6dd201bb328f1c1eac23a96d8、署名が載っています。形式を「LINE Messaging API」にして「例」を押すと、次の値になります。

x-line-signature: GhRKmvmHys4Pi8DxkF4+EayaH0OqtJtaZxgTD9fMDLs=

ドキュメントの openssl dgst -sha256 -hmac … -binary | openssl base64 と同じ結果です。ボディを見やすく整形してから貼ると一致せず、本ツールは「1 行に詰めた JSON と一致します」のように、どう変わったかを示します。

Chatwork はトークンをデコードしてから使う

Chatwork の Webhook ドキュメントは、「トークンをBase64デコードしたバイト列を秘密鍵とします」と定めています。説明用に chatwork-webhook-token-sample-01 を Base64 にしたトークン Y2hhdHdvcmstd2ViaG9vay10b2tlbi1zYW1wbGUtMDE= と、短いボディで計算した例です。

co2OlvkgxgqT06s8DH9nYIM3DZQ+rUqAmNIBqGH6RLA=

トークンを文字列のまま鍵にすると Sn51C3lS… になり、ヘッダーとは一致しません。この値を貼り付けると、本ツールは「鍵をテキスト(UTF-8)として読むと一致します」と表示します。署名はリクエストパラメーター chatwork_webhook_signature にも入りますが、そちらは URL エンコードされているので、%2B などはそのまま貼り付けて構いません(自動でデコードします)。

形式ごとの署名対象

形式署名対象鍵送られ方
GitHubボディWebhook secret(テキスト)sha256= + 16 進数
Stripet +「.」+ ボディwhsec_ を含む全体t=…,v1=…
Slackv0: + タイムスタンプ +「:」+ ボディSigning Secretv0= + 16 進数
LINE / Shopifyボディチャネルシークレット / クライアントシークレットBase64
Chatworkボディトークンを Base64 デコードBase64

Stripe と Slack は 5 分より古いタイムスタンプを拒否するよう求めているので、範囲外なら本ツールも注意を出します。Stripe のヘッダーを貼り付けると、タイムスタンプ欄が空のときは t= の値を自動で入れます。

Shift_JIS の文字列に署名するとき

テキストは UTF-8 でバイト列にします。「署名」は UTF-8 では 6 バイト、Shift_JIS では 8f9096bc の 4 バイトです。鍵 key での結果は次のとおりです。

UTF-8:8401f7fe91c2a264a4ee5d8af3d768cd8a6edcaa962441b61043d65311099296

Shift_JIS(メッセージの形式を 16 進数にして 8f9096bc):6c28ecde248e521ec23726c44942d60c1899c9db1a5c7dacd25c31838b24dd18

古い連携先の仕様が Shift_JIS で署名している場合は、16 進数に変換してから入力してください。

他の HMAC ツールとの違い

2026-10-01 に GitHub ドキュメントの例で確認しました。CoderTools は SHA3 や RIPEMD-160 も選べ、ブラウザ内で計算します。ただし鍵を 16 進数にして 0b0g を入れると「無効な16進数形式です」と出るだけで何文字目かは示さず、直前の結果も画面に残ります。メッセージが空だと計算しないため、空メッセージに署名する Feishu 方式は扱えません。本ツールは誤りの位置を示し、エラー時は結果を消します。署名ヘッダーを sha256=… や t=…,v1=… の形のまま照合できます。

制限

  • アルゴリズムは MD5・SHA-1・SHA-224・SHA-256・SHA-384・SHA-512。SHA-3・RIPEMD-160 は Web Crypto API にないため扱いません。
  • テキスト欄の改行はすべて LF になります。CRLF で署名された場合は改行コードを CRLF にし、それ以外の特殊なバイトは 16 進数か Base64 で入力してください。
  • ブラウザでの照合はデバッグ用です。サーバーでは受信したボディのバイト列を使い、定数時間で比較してください。JWT の HS256 も HMAC-SHA256 なので、JWT ジェネレーターで扱えます。

鍵を使わないハッシュ値はハッシュジェネレーター、HMAC-SHA1 を使うワンタイムパスワードは2段階認証コード生成ツールを使ってください。

FAQ

秘密鍵が送信・保存されることはありますか?

ありません。SHA-1・SHA-256・SHA-384・SHA-512 はブラウザ標準の Web Crypto API、MD5 と SHA-224 はページ内のコードで計算します。通信は行わず、鍵やメッセージを localStorage・Cookie・URL にも書きません。このページはアクセス解析や広告のスクリプトも読み込みません。再読み込みすると入力は消えます。

LINE の署名検証が通りません。

受信したボディ文字列をそのまま使っているか確認してください。LINE の公式ドキュメントも、JSON をパースしてから文字列に戻す、整形する、エスケープを解釈する、UTF-8 以外で扱う、といった処理で検証が失敗すると説明しています。署名ヘッダーを「照合する署名」に貼り付けると、本ツールは改行の有無や JSON の整形などを順に試し、一致した原因を表示します。

Chatwork の Webhook 署名はどう計算しますか?

Webhook 編集画面のトークンを Base64 デコードしたバイト列を鍵にし、受信したボディの HMAC-SHA256 を Base64 にします。トークンを文字列のまま鍵にすると一致しません。形式で「Chatwork Webhook」を選ぶとデコードまで自動で行います。

どのアルゴリズムを選べばよいですか?

相手の仕様に合わせます。新しく設計するなら HMAC-SHA256 が一般的で、LINE・Chatwork・GitHub・Stripe・Slack などが使っています。HMAC-SHA1 は Twilio や GitHub の旧ヘッダー X-Hub-Signature、HMAC-MD5 は古いシステムと RFC 2104 のテストベクター用です。

サーバーで署名を == で比較してもよいですか?

避けてください。Node.js の crypto.timingSafeEqual(長さが違うと例外になるので先に長さを比較)、Python の hmac.compare_digest、Go の hmac.Equal、Java の MessageDigest.isEqual のような定数時間の比較を使います。本ツールの照合はブラウザ内だけで行うので、時間差は問題になりません。