使い方
- メッセージにデータを入力します。バイナリのデータは、メッセージの形式で16進数かBase64を選んでください。
- 秘密の鍵を鍵に入力し、鍵の形式で書き方を選びます。
- HMACの値の4行を読みます。必要な値をコピーするか、使っているシステムの値と比べてください。
- 他のシステムと値が違う場合は、まずバイト列を確かめてください。改行コードや文字コードが違うと、HMACも変わります。
HMACとは
HMAC(RFC 2104)は、メッセージ認証コードです。秘密の鍵を知っている人だけが作れる短い値です。通常のハッシュ関数Hを、メッセージと鍵に対して2回使って作ります。そのため、同じハッシュ関数を表の4行で使えます。鍵が必要なので、HMACが一致すれば、メッセージが変更されておらず、鍵を持つ人から来たことが示せます。
HMACはメッセージを隠しません。メッセージを持つ人なら誰でも読めます。HMACは、そのメッセージが正しいかを確かめさせるだけです。
HMAC(K, m) = H((K XOR opad) || H((K XOR ipad) || m))
ipad = 0x36のバイトをB回繰り返したもの
opad = 0x5CのバイトをB回繰り返したもの
B = Hのブロック長:SHA-1とSHA-256は64バイト、SHA-384とSHA-512は128バイト
使うハッシュ関数と鍵
HMAC-SHA-256が一般的な選択で、多くのWebhookやAPIが使っています。HMAC-SHA-512は同じ仕組みで出力が長いものです。HMAC-SHA-1は古いシステムには残っていますが、新しい設計では選びません。
鍵はランダムで、少なくともハッシュの出力と同じ長さが望ましいです。単語や短い文を鍵にすると推測されやすく、推測された鍵のHMACには価値がなくなります。
16進数とBase64
どちらの形式も同じバイト列を表します。16進数は1バイトを2桁で書くため、SHA-256は64桁になります。Base64は3バイトを4文字で書くため、SHA-256は44文字になり、その最後は詰め物の=です(RFC 4648)。
- HMAC-SHA-1:16進数40桁、Base64 28文字
- HMAC-SHA-256:16進数64桁、Base64 44文字
- HMAC-SHA-384:16進数96桁、Base64 64文字
- HMAC-SHA-512:16進数128桁、Base64 88文字
計算例:RFC 4231のテストケース2
鍵をJefe、メッセージをwhat do ya want for nothing?とすると、SHA-256、SHA-384、SHA-512についてはRFC 4231の2番目のテストケース、SHA-1についてはRFC 2202のテストケースです。下の表は、このページが示す値です。HMAC-SHA-256の値は、RFCが載せている5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843と同じです。
| アルゴリズム | 16進数 | Base64 |
|---|---|---|
| HMAC-SHA-1 | effcdf6ae5eb2fa2d27416d5f184df9c259a7c79 | 7/zfauXrL6LSdBbV8YTfnCWafHk= |
| HMAC-SHA-256 | 5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843 | W9zBRr9gdU5qBCQmCJV1x1oAPwidJzmDnexYuWTsOEM= |
| HMAC-SHA-384 | af45d2e376484031617f78d2b58a6b1b9c7ef464f5a01b47e42ec3736322445e8e2240ca5e69e2c78b3239ecfab21649 | r0XS43ZIQDFhf3jStYprG5x+9GT1oBtH5C7Dc2MiRF6OIkDKXmnix4syOez6shZJ |
| HMAC-SHA-512 | 164b7a7bfcf819e2e395fbe73b56e0a387bd64222e831fd610270cd7ea2505549758bf75c05a994a6d034f65f8f0e6fdcaeab1a34d4a6b4b636e070a38bce737 | Fkt6e/z4GeLjlfvnO1bgo4e9ZCIugx/WECcM1+olBVSXWL91wFqZSm0DT2X48Ob9yuqxo01Ka0tjbgcKOLznNw== |
よくある質問
HMACはメッセージを暗号化することと同じですか?
いいえ。HMACはメッセージを隠さないため、誰でも読めます。HMACが示すのは、メッセージが変更されていないことと、送り手が鍵を知っていることだけです。秘密を守るには暗号化が必要です。
ハッシュとHMACの違いは何ですか?
ハッシュはメッセージだけで決まるため、誰でも計算できます。HMACは秘密の鍵も必要とするため、鍵を持つ人だけが作成や検証をできます。鍵を使わない単純なハッシュ値は、ハッシュ生成ツールで計算できます。
ライブラリの値と、このページのHMACが違うのはなぜですか?
鍵かメッセージのバイト列が違うためです。文字列として入力した鍵は、そのUTF-8のバイト列になり、同じ文字を16進数で書いた鍵は別のバイト列になります。メッセージの末尾の改行も、HMACを変えます。
鍵の長さはどのくらいにすればよいですか?
ハッシュの出力と同じ長さ以上のランダムな鍵を使ってください。HMAC-SHA-256なら32バイトです。RFC 2104は短い鍵を強く非推奨としており、単語や短い文から作った鍵は推測されやすくなります。
このページでWebhookの署名を確かめられますか?
署名されたものとまったく同じバイト列を使えば確かめられます。WebhookのHMACは、たいてい加工されていないリクエストの本文に対して計算されるため、本文は変えずに貼り付けてください。整形し直したJSONの本文では、HMACが変わります。
入力した鍵やメッセージは、どこかに送られますか?
いいえ。HMACはお使いのブラウザ自身のSubtleCryptoを使って、ブラウザの中で計算されます。鍵もメッセージもアップロードされず、保存もされません。
出典
- RFC 2104:HMAC、メッセージ認証のための鍵付きハッシュ(英語)
- RFC 4231:HMAC-SHA-224、-256、-384、-512の識別子とテストベクター(英語)
- RFC 2202:HMAC-MD5とHMAC-SHA-1のテストケース(英語)
- RFC 4648:Base16、Base32、Base64のデータ符号化(英語)
- NIST FIPS 180-4:Secure Hash Standard、SHA-1とSHA-2ファミリー(英語)
数値と文章の最終確認日:2026年11月10日火曜日。