結城浩のはてなブログ

ふと思いついたことをパタパタと書いてます。

「Hash ≠ MAC」の意味

はてな認証APIに関連して、kazuhoさんが以下のエントリを書いておられます。(via まちゅダイアリー)

これは「秘密鍵をメッセージの頭に付けて計算した一方向ハッシュ関数(メッセージダイジェスト関数)のハッシュ値を、メッセージ認証コード(MAC)として使うことの危険性」について書かれたものです。
はてな認証APIに限らず、同じような仕組みを実装している方がもしいらっしゃいましたら上記のページを確認なさったほうがよいと思います。
要するに、MACがほしかったらMD5SHA-1を生で使うのではなくHMACを使いましょうね、ということになります。
余談:
kazuhoさんがまちゅさんちに書かれていた説明を読んで、結城は最初、愚かにもMD5脆弱性絡みの話題かと思っていました。でも、それは結城の誤解でした。生のハッシュを使うのではなくHMACを使うのが正しいです。論文Keying Hash Functions for Message Authenticationにも、またシュナイアー『暗号技術大全』(p.508)にも書かれていますね。ハッシュ関数がiterativeな性質(出てきたハッシュ値が自分の次の内部状態になる)を持つ限り、この危険性からは免れません。拙著『暗号技術入門』のMACの章ではこの攻撃については触れていませんでしたね。p.309に類似のクイズがありますが。
勉強になりました。kazuhoさん、ありがとうございます。
追記:
kazuhoさんのエントリが追加されていました。

これに関しては、シュナイアー『暗号技術大全』(p.508)に「メッセージの最後に鍵を入れるH(M, K)のほうがよいが、これにも同様の問題がある」と書かれていますね。参考文献はPreneel→Scheierの私信になっていましたが。