CubicLouve

Spring_MTの技術ブログ

MAC(メッセージ認証コード)とは

MAC(Message Authentication Code メッセージ認証コード)について、整理してみました。

(MACアドレスMACはMedia Access Controlの頭文字なので同じ文字面ですが全然意味が違いますね。)

MACは自分に届いたメッセージが送信者が意図した通り(改竄されてない、なりすましていない)であることを確認できます。

メッセージが改竄されていないことは、メッセージのintegrity(正真性、完全性)という性質です。

メッセージがなりすまされて送信されていない(正しい送信者からのものである)ということを、メッセージの認証という性質です。

MACは正真性を確認し、メッセージの認証を行います。

メッセージ認証コードとは

メッセージ認証コードには、

  • 送信者と受信者が共有する鍵(共有鍵、MAC鍵、ハッシュ鍵ともよばれることもある)
  • 任意のメッセージ

を元に固定ビット長の出力をします。

出力された値は MAC と呼ばれます。

一方向ハッシュ関数でメッセージのハッシュ値を取るのと似ていますが、この場合共有鍵はでてきません。

一方向ハッシュ関数を拡張して認証をできるようにしたのがMAC(メッセージ認証コード)になります。

MAC(メッセージ認証コード)を利用するための手順

MACを使った改竄検知、認証のフローの手順です。

  1. 受信者、送信者の二者で共有鍵を共有する(鍵配送問題が存在します)
  2. 送信者はメッセージと共有鍵の2つからMAC値を計算
  3. 送信者はメッセージとMAC値の両方を受信者に送る
  4. 受信者はメッセージを元にMAC値を計算する
  5. 受信者は送信されたMAC値を自分で計算したMAC値を比較する。

最後に計算したMAC値を比較し、MAC値が等しい場合は、メッセージが間違いなく送信者から送られてきたものします。

MAC

MAC(メッセージ認証コード)はハッシュ関数の拡張か生まれているので、一方向ハッシュ関数を用いて実現できます。

また、ブロック暗号でも実現可能です。

CMAC - Wikipedia

HMAC

MAC(メッセージ認証コード)を、一方向ハッシュ関数(SHA256等)を用いて実現する方法です。

  1. 共通鍵を一方向ハッシュ関数のブロック長より短い場合は、0パディングをする。
  2. 固定文字列ipad(バイト値 0x36 を 64回(ブロック長)繰り返した文字列)とパディングした鍵とのビット列のXORをとる
  3. 2で生成したバイト列をメッセージの先頭につける
  4. 3の結果を一方向ハッシュ関数を適用して、ハッシュ値を得る
  5. 固定文字列opad(バイト値 0x5C を 64 回(ブロック長)繰り返した文字列)と4で得られたビット列とのXORをとる
  6. 5で生成したビット列に4で生成されたハッシュをつける
  7. 6の結果を一方向ハッシュ関数に適用してハッシュ値を得る -> これがMAC値になる

再送攻撃(再生攻撃)への対応

すでに送られて、正しく認証されたMAC値とメッセージを取得しておき、それをなにも加工せずに使いまわして同じメッセージを送り続けることです。

防御策としては、

  1. メッセージにシーケンス番号を含めておく

    • 通信相手ごとに最後のシーケンス番号を記録しておかなければならない
  2. メッセージにタイムスタンプを含めておきMAC値が一致しても古いメッセージが送られて来た場合にエラーにする(脆弱性残る)

    • タイムスタンプの粒度(一秒とかだと一秒の間で攻撃される)の問題がある
    • 送信者と受信者で時計を一致させるか、古いと判定するための時間に幅をもたせておくことをするが、ここも攻撃される可能性がある
  3. 使い捨てのランダムな値(ノンス)をメッセージに含めて送信する。

    • 通信量が少し多くなるが、有効な手法

鍵の推測への対応

共有鍵は暗号学的に安全な疑似乱数生成器を使ってください。

できないこと

  • 三者に対する証明 送信者と受信者の区別が第三者には判断できない。

デジタル署名によって解決できます。

  • 否認防止 送信者と受信者の区別が第三者には判断できない。

これもデジタル署名によって解決できます。

認証付き暗号(Authenticated Encryption with Associated Data)

認証付き暗号 - Wikipedia

Authenticated Encryption with Associated Dataを略してAEADとも呼ばれます。

MAC(メッセージ認証コード)と対称暗号を組み合わせて、機密性(暗号)、認証・正真性(MAC(メッセージ認証コード))を満たす仕組みです。

AEAD(認証付き暗号)では不適切に細工された暗号文を識別して(MACの認証と正真性)復号を拒否することができるため、選択暗号文攻撃に対して安全になります。

AEADは現在のところTLSで利用できる最良の暗号化利用モードです。

SSL/TLSの暗号化利用モードにおいて、AEAD(認証付き暗号)の一種GCMが利用可能です。

Galois/Counter Mode - Wikipedia

ただし下記記事にあるように、素のままのOpenSSLには問題ないのですが、自前で実装されている場合は注意が必要です。

d.hatena.ne.jp

国際標準暗号GCMの新たな安全性評価結果(2012年08月17日):プレスリリース | NEC

参照

HMAC: Keyed-Hashing for Message Authentication

qiita.com

http://www.gtc.co.jp/glossary/cia.html

この記事は、クリエイティブ・コモンズ・表示・継承ライセンス3.0のもとで公表されたウィキペディアの項目「メッセージ認証符号」を素材として二次利用しています。