HMAC

HMAC (Hash-based Message Authentication Code または keyed-Hash Message Authentication Code) とは、メッセージ認証符号 (MAC; Message Authentication Code) の一つであり、秘密鍵とメッセージ（データ）とハッシュ関数をもとに計算される。

1997年2月、IBMのKrawczykらにより提唱され、として公開されている。また、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は次のように定義される：
 
ここで、  は繰返し型ハッシュ関数、 は秘密鍵、 は認証対象のメッセージ、 と  は定数パディング（具体的には16進数で ）、""はビット列の連結、""は排他的論理和を表す。繰り返し型ハッシュ関数は、任意長の入力を固定長のブロックに分割してから、ブロック毎に圧縮関数で処理することでハッシュ値を求める。例えば、SHA-256では1ブロックは512ビットである。HMACでは、 と  がちょうど1ブロックとなるように、秘密鍵と定数パディングの長さが調整される。もし秘密鍵  が1ブロックより短い場合は、  を先頭に寄せて末尾に0x00を必要なだけ追加してブロック長にする。また、定数パディングはちょうど1ブロックになるように0x5cあるいは0x36を繰り返す。例えば、ハッシュ関数のブロック長が 512ビット（64オクテット）ならば、ipad と opad は、それぞれ64オクテットの 0x36 や 0x5c の連続である。

脚注

参考文献 
 Mihir Bellare, Ran Canetti and Hugo Krawczyk, "Keying Hash Functions for Message Authentication", CRYPTO'96, pp1–15, 1996.

外部リンク 
 
 HMAC： メッセージ認証のための鍵付ハッシング (HMAC: Keyed-Hashing for Message Authentication) — IPAによる日本語訳

暗号
誤り検出訂正
メッセージ認証コード
2104