MAC(メッセージ認証コード)とは
MAC(Message Authentication Code メッセージ認証コード)について、整理してみました。
(MACアドレスのMACはMedia Access Controlの頭文字なので同じ文字面ですが全然意味が違いますね。)
MACは自分に届いたメッセージが送信者が意図した通り(改竄されてない、なりすましていない)であることを確認できます。
メッセージが改竄されていないことは、メッセージのintegrity(正真性、完全性)という性質です。
メッセージがなりすまされて送信されていない(正しい送信者からのものである)ということを、メッセージの認証という性質です。
MACは正真性を確認し、メッセージの認証を行います。
メッセージ認証コードとは
メッセージ認証コードには、
- 送信者と受信者が共有する鍵(共有鍵、MAC鍵、ハッシュ鍵ともよばれることもある)
- 任意のメッセージ
を元に固定ビット長の出力をします。
出力された値は MAC値 と呼ばれます。
一方向ハッシュ関数でメッセージのハッシュ値を取るのと似ていますが、この場合共有鍵はでてきません。
一方向ハッシュ関数を拡張して認証をできるようにしたのがMAC(メッセージ認証コード)になります。
MAC(メッセージ認証コード)を利用するための手順
MACを使った改竄検知、認証のフローの手順です。
- 受信者、送信者の二者で共有鍵を共有する(鍵配送問題が存在します)
- 送信者はメッセージと共有鍵の2つからMAC値を計算
- 送信者はメッセージとMAC値の両方を受信者に送る
- 受信者はメッセージを元にMAC値を計算する
- 受信者は送信されたMAC値を自分で計算したMAC値を比較する。
最後に計算したMAC値を比較し、MAC値が等しい場合は、メッセージが間違いなく送信者から送られてきたものします。
MAC(メッセージ認証コード)はハッシュ関数の拡張か生まれているので、一方向ハッシュ関数を用いて実現できます。
また、ブロック暗号でも実現可能です。
HMAC
MAC(メッセージ認証コード)を、一方向ハッシュ関数(SHA256等)を用いて実現する方法です。
- 共通鍵を一方向ハッシュ関数のブロック長より短い場合は、0パディングをする。
- 固定文字列ipad(バイト値 0x36 を 64回(ブロック長)繰り返した文字列)とパディングした鍵とのビット列のXORをとる
- 2で生成したバイト列をメッセージの先頭につける
- 3の結果を一方向ハッシュ関数を適用して、ハッシュ値を得る
- 固定文字列opad(バイト値 0x5C を 64 回(ブロック長)繰り返した文字列)と4で得られたビット列とのXORをとる
- 5で生成したビット列に4で生成されたハッシュをつける
- 6の結果を一方向ハッシュ関数に適用してハッシュ値を得る -> これがMAC値になる
再送攻撃(再生攻撃)への対応
すでに送られて、正しく認証されたMAC値とメッセージを取得しておき、それをなにも加工せずに使いまわして同じメッセージを送り続けることです。
防御策としては、
メッセージにシーケンス番号を含めておく
- 通信相手ごとに最後のシーケンス番号を記録しておかなければならない
メッセージにタイムスタンプを含めておきMAC値が一致しても古いメッセージが送られて来た場合にエラーにする(脆弱性残る)
- タイムスタンプの粒度(一秒とかだと一秒の間で攻撃される)の問題がある
- 送信者と受信者で時計を一致させるか、古いと判定するための時間に幅をもたせておくことをするが、ここも攻撃される可能性がある
使い捨てのランダムな値(ノンス)をメッセージに含めて送信する。
- 通信量が少し多くなるが、有効な手法
鍵の推測への対応
共有鍵は暗号学的に安全な疑似乱数生成器を使ってください。
できないこと
デジタル署名によって解決できます。
- 否認防止 送信者と受信者の区別が第三者には判断できない。
これもデジタル署名によって解決できます。
認証付き暗号(Authenticated Encryption with Associated Data)
Authenticated Encryption with Associated Data
を略してAEAD
とも呼ばれます。
MAC(メッセージ認証コード)と対称暗号を組み合わせて、機密性(暗号)、認証・正真性(MAC(メッセージ認証コード))を満たす仕組みです。
AEAD(認証付き暗号)では不適切に細工された暗号文を識別して(MACの認証と正真性)復号を拒否することができるため、選択暗号文攻撃に対して安全になります。
AEADは現在のところTLSで利用できる最良の暗号化利用モードです。
SSL/TLSの暗号化利用モードにおいて、AEAD(認証付き暗号)の一種GCM
が利用可能です。
Galois/Counter Mode - Wikipedia
ただし下記記事にあるように、素のままのOpenSSLには問題ないのですが、自前で実装されている場合は注意が必要です。
国際標準暗号GCMの新たな安全性評価結果(2012年08月17日):プレスリリース | NEC
参照
HMAC: Keyed-Hashing for Message Authentication
http://www.gtc.co.jp/glossary/cia.html
この記事は、クリエイティブ・コモンズ・表示・継承ライセンス3.0のもとで公表されたウィキペディアの項目「メッセージ認証符号」を素材として二次利用しています。