« Hash ≠ MAC | メイン | はてな認証 API への攻撃シナリオ »

2006年05月08日

秘密鍵を後置している MAC の危険性

 先のエントリについて、結城さんが『「Hash ≠ MAC」の意味』に、まとめてくださっています。ありがとうございます。

16:37 追記: すいません。注1 の仮定が現実的でないように思います。よって、以下は成り立たないの攻撃は現時点では難しいかと。バイナリデータなら、TLV の L を、コリジョンデータの値が異なるところに着地させる可能なのかも。

 ついでに、秘密鍵が後置されている場合のリスクについても考えていたのですが、

  • ハッシュ関数の衝突例が知られている
  • 毎回選択平文攻撃が可能
  • ゴミデータの挿入が可能 (これは前置型と同等の条件)

の3条件がすべて満たされている場合は、危険なんじゃないでしょうか。

 というのは、同じハッシュ値をもつ "[ゴミデータ][任意の1バイト]" と "[別のゴミデータ][特定の1バイト]" という2つの異なるデータを用意できれば、攻撃が可能だからです。

 たとえば、今回のようなケースでは、仮に秘密鍵が後置されていたとしても、

...[ゴミデータ]&[任意の1文字]ert=[cert値]

のハッシュ値を選択平文攻撃で取得できれば、同じハッシュ値をもつ、

...[別のゴミデータ]&cert=[cert値]

というリクエストを生成できるということになります注2

 MD5 については、パソコンで1分以内に衝突を発見できるレベルにあるそうです。SHA-1 については、現在のところ衝突は知られていないものの、

It has been speculated that finding a collision for SHA-1 is within reach of massive distributed Internet search.
(SHA hash functions - Wikipedia, the free encyclopedia)

という状況にあるようです注3

 いずれにせよ、結論が「HMAC を使うべき」注4である点は、変わりません。

9:05 追記: ぼけていて申し訳ないですが、上の話はオレオレ HMAC に限った話ではなくって、ハッシュ関数一般の話ですね。冗長でゴミデータを埋め込めるようなデータ形式の場合は、コリジョンを起こすブロックの先頭または末尾のキャラクタの差を利用して、同一のハッシュ値だが異なる意味をもつ複数種の文書を作成することができる、ということでしょうか。


注1: 衝突の発生するデータの分布が特殊でないことを仮定しています。まともなハッシュ関数なら、この仮定は満たされるんじゃないでしょうか
注2: ハッシュ値計算の際にパラメータ間にセパレータが入る場合についても、「特定の1バイト」をそのセパレータにしてしまえば良いので、評価は同等です
注3: 約 1/128 の確率で最初の衝突が公知になった瞬間に、上の攻撃が可能になります (9:17 追記: IV の問題があるので実際の確率はより低いでしょうか。上の例においては 1/300 くらい?)
注4: HMAC は使用するハッシュ関数の強衝突耐性に依存していないため、安全性が高いということ

投稿者 kazuho : 2006年05月08日 07:31 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

トラックバック

このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/579