HMAC (Hash-based Message Authentication Code)
HMAC(Hash-based Message Authentication Code)は、
メッセージ認証符号(MAC)の一種で、秘密鍵とメッセージ(データ)、そして
ハッシュ関数を用いて算出される認証コードです。この技術は、データの改ざんを検出するとともに、メッセージの送信者が秘密鍵を共有している正当な人物であることを保証するために利用されます。
1997年2月に、IBMのKrawczykらによって提唱され、RFC 2104として公開されました。また、FIPS PUB 198にも採用されており、広く利用されています。
概要
メッセージ認証符号(MAC)は、認証とデータの改ざん検出の中核となるアルゴリズムです。HMACアルゴリズムは、MAC値を算出する際に
暗号学的
ハッシュ関数を使用します。
ハッシュ関数には、SHA-2やSHA-3など、任意の繰り返し型
ハッシュ関数を適用することが可能です。
ハッシュ関数Xを用いたHMACは、HMAC-Xと呼ばれます。例えば、SHA256を用いた場合は、HMAC-SHA256となります。
HMACのMAC値(タグ)の長さは、使用される
ハッシュ関数の出力長と同一です。例えば、HMAC-SHA256の場合、タグは256ビットになります。
他のMACと同様に、HMAC自体は
暗号化機能を持っていません。タグはメッセージ(または
暗号化されたメッセージ)と共に送信されます。秘密鍵を共有している受信者は、受け取ったメッセージと秘密鍵からHMACアルゴリズムを用いてMAC値を再計算し、送信されたタグと照合することで、受け取ったメッセージが鍵を共有している者から送信されたものであることを確認します。
定義
HMACは、以下の数式で定義されます。
`HMAC_K(m) = h((K ⊕ opad) || h((K ⊕ ipad) || m))`
ここで、
- - hは、繰り返し型ハッシュ関数を表します。
- - Kは、秘密鍵を表します。
- - mは、認証対象となるメッセージを表します。
- - ipad と opad は、定数パディングを表します。具体的には、16進数で`ipad = 0x363636...3636`、`opad = 0x5c5c5c...5c5c`と定義されます。
- - ||は、ビット列の連結を表します。
- - ⊕は、排他的論理和を表します。
繰り返し型
ハッシュ関数は、任意の長さの入力を固定長のブロックに分割し、ブロックごとに圧縮関数を適用することでハッシュ値を算出します。例えば、SHA-256では、1ブロックは512ビットです。
HMACでは、`(K ⊕ opad)`と`(K ⊕ ipad)`がちょうど1ブロックとなるように、秘密鍵と定数パディングの長さが調整されます。もし秘密鍵Kが1ブロックより短い場合は、Kを先頭に寄せて、末尾に0x00を必要なだけ追加してブロック長にします。また、定数パディングはちょうど1ブロックになるように、0x5cまたは0x36を繰り返します。例えば、
ハッシュ関数のブロック長が512ビット(64オクテット)の場合、ipadとopadは、それぞれ64オクテットの0x36や0x5cの連続になります。
注意点
- - HMACはメッセージ認証のためのものであり、暗号化は行いません。
- - 安全な鍵管理が非常に重要です。鍵が漏洩した場合、メッセージの認証が破られてしまいます。
参考文献
- - Mihir Bellare, Ran Canetti and Hugo Krawczyk, "Keying Hash Functions for Message Authentication", CRYPTO'96, pp1–15, 1996.
外部リンク