HMAC

読み:えいちまっく / 英語表記:Hash-based Message Authentication Code

送信者と受信者が共有する鍵とハッシュ関数を組み合わせて、メッセージ認証コード(MAC)を作る方式。データの改ざんの検出と、送信者の認証に使う。暗号化の方式ではない。

イマシルちゃんの解説

ハッシュ値は、データの「指紋」みたいなものだったよね。
でも、ハッシュ値だけだと、悪い人がデータを書き換えて、ハッシュ値も計算し直したら、バレないんだ。

HMACは、送る人と受け取る人だけが知っている「秘密の合言葉(鍵)」を混ぜて、指紋を作るんだ。
合言葉を知らない人には、正しい指紋が作れない。
だから、書き換えられていないこと、本物の相手から届いたことを確かめられるんだよ!

より深い解説

定義

HMAC(Hash-based Message Authentication Code)は、RFC 2104で定められた、ハッシュ関数を使ってメッセージ認証コード(MAC)を計算する方式である。送信者と受信者が共有する秘密鍵と、メッセージから、MAC値を計算する。

HMAC(K, m) = H( (K ⊕ opad) ‖ H( (K ⊕ ipad) ‖ m ) )

Kは鍵、mはメッセージ、Hはハッシュ関数、ipadとopadは決められた定数、⊕は排他的論理和、‖は連結を表す。ハッシュ関数を2回使う構造で、単純に「鍵とメッセージをつなげてハッシュ値をとる」方法の弱点を避けている。

使うハッシュ関数によって、HMAC-SHA1、HMAC-SHA-256 のように呼ばれる。

使い方

  1. 送信者は、メッセージと共有鍵からMAC値を計算し、メッセージに付けて送る
  2. 受信者は、受け取ったメッセージと共有鍵から、同じようにMAC値を計算する
  3. 2つのMAC値が一致すれば、メッセージは改ざんされておらず、鍵を持つ相手から送られたと判断できる

実現できること・できないこと

性質HMACで
完全性(改ざんの検出)できる
送信者の認証(鍵を持つ相手か)できる
機密性(暗号化)できない。メッセージそのものは平文のまま
否認防止できない(鍵を共有しているため、どちらが作ったかを第三者に証明できない)

ハッシュ値・デジタル署名との比較

方式鍵改ざんの検出送信者の認証否認防止
ハッシュ値だけなし偶然の誤りは検出できるが、意図的な改ざんは見抜けないできないできない
HMAC共通鍵できるできるできない
デジタル署名公開鍵と秘密鍵できるできるできる

使われている場面

場面用途
IPsec(ESP、AH)パケットの完全性と認証(HMAC-SHA-256 など)
TLS鍵の導出(HKDF)や、古い暗号スイートでのレコードの完全性
Web APIリクエストの署名(APIの鍵でHMACを計算して付ける)
ワンタイムパスワードHOTP、TOTPは、HMACを使ってワンタイムパスワードを作る

IPsecで「暗号化のアルゴリズム」として挙げられるのはAESなどであり、HMAC-SHA1やHMAC-SHA-256は、「完全性(認証)のアルゴリズム」である。

実際の試験ではここに出る!

この用語が出てくる記事

↑