ハッシュ衝突なお話 | もっとコンピュータが好きになるblog

ハッシュ衝突なお話

ンデー読んできました.大好きだった作品,「モンキーターン」がついに感動の最終回.最期の最期に優勝&澄に告白はエンディングとしてベタだなと感じましたが個人的に最高でした,去年の今当たり,先輩とモンキーターン談義していた時,「澄派,青島派」で盛り上がって,その時僕は青島派だったんですが,そんな青島派の僕でも最期には幼なじみの澄を選んだ所は元の鞘に収まった感じでよかったと感じましたよ.河合先生にはしっかりと休んで頂いて,また面白いスポーツ漫画を書いて頂きたいと思います.
(あ,後サンデーの編集者さんに一言.唯一無二の競艇漫画と帯に書いてましたが,競艇漫画は「モンキーターン」だけじゃないですよ.「競艇少女」を忘れてもらっては困ります :) )

あ,それから本屋でWindows100%見てきたんですが,第一特集が「脱マイクロソフト」なんですよ.てっきり「Appleマンセー」とか「やっぱAmigaでしょ」とか「いやいや国産BTronも捨てがたい」とか,笑えるネタやってるくれるのかと思ったら,「SP2をいれるな」とか「フリーソフトを使え」とかいうネタでかなりショボーンでした.タイトルにだまされた~.Windows使ってる時点で「脱」出来てないよ.(結構マイナーOSの話とか書いてしまいましたが,これらに関しては後々暇があったら書きます)



ちなみに,今回の前置きの話は今日のネタとは全く関係ありません.だたモンキーターンの最終回だからという理由とWindows100%が笑えたので書いただけです.今日のネタは予告通り,セキュリティの話をしようと思います.でも僕は専門がセキュリティではありません.わかる範囲で書いていきますのでご了承くださいませ.んで,セキュリティという事ですが,セキュリティ一発目は暗号の話でハッシュの衝突に関して書いてゆこうと思います.

今回の話は一方向ハッシュ関数というものが焦点となります.一方向ハッシュ関数とは,その関数に何らかの値を入力する事で得られる値があるとします.その得られた値から,入力した値が判別出来ないというのが一方向ハッシュ関数というものです.同じデータのハッシュはいつも同じ値になり,他のデータのハッシュ値とぶつからないようにします.多分,この文だけだとちんぷんかんぷんな気もするので,もう少し簡単にするとこんな感じ.

水+鶏ガラ+野菜を煮込むとラーメンの出汁が出来ました.ラーメンの出汁から元の食材はわかりませんということです.(正確には味のわかる人にはわかりそうですが,ここではそれは無しということで) (どんなにでかいファイルを関数につっこんでも関数によって決められた長さのデータとしてはき出されます.ファイルのダイジェストのようなので一方向ハッシュ関数の事をダイジェスト関数とも呼びます.)

一方向ハッシュの使い方としては,いくつかありますが,例えば,ファイルのダウンロードに使います.送信前にファイルそのもののハッシュを取っておきます.ユーザさんは自分のマシンにそのファイルをダウンロードします,そのファイルがキチンと送られていなかったり,誰かに改竄されていたりするとデータ量が微妙に変化しますから,ダウンロードしたファイルのハッシュを取るとアップロード時のハッシュと異なる可能性があります.そうなるとダウンロード失敗がわかるという具合です.(例:apacheというサーバプログラムのハッシュ値


アップロード時(送信側)
  ハッシュ関数(ファイル) = ハッシュ値「0000」
ダウンロード時(受信側)
  ハッシュ関数(ファイル) = ハッシュ値「0010」(ちょっと値が違う)


それからamebloでもログインして投稿しますが,そこにも使われています.ログインIDとパスワードの組に関数をかけてハッシュを取ります.その後,再度同じIDとパスワードを入力すると先ほどと同じハッシュ値が返るので,正しいIDとパスワードの組であることがわかるわけです.もちろん一方向性であるため,ハッシュ値から元のIDとパスワードを把握する事は管理者ですら出来ません.

ハッシュ関数にはいくつか種類がありまして,CRC32といった簡単なものからMD4,MD5,HAVAL128,SHA1,SHA256,RIPEMD128などなどいろいろあります.基本は先ほど簡単に説明した通り,元のデータがなんなのかわからないようなハッシュ値を出すだめの関数です.いろいろありますが,ハッシュ値の計算の違いや出てくる値の大きさ(正確にはビット長といいますが)の違いとなっています.ここらの話はRFCにも出てますし,もしもう少し詳しい話プリーズとかコメントあったらまた話しようと思います.とりあえず今回はこちらがメインではないので,ここでは紹介のみ.



ようやく,今日書くところに到着.そもそもは暗号の国際会議CRYPTO2004のこのレポートから話は始まります.このレポートではMD4やMD5やHAVAL128それからRIPEMDにハッシュの衝突を発見したというものです.これはとても問題で,ハッシュはその性質からAのデータのハッシュはBのデータからのハッシュと異なっていなければなりません.これは当たり前で,先ほどのログインの例をあげたら,適当なIDとパスワード入力したら入れたとなってしまったら,セキュリティもなにもあったものではありません.
(ちなみに計算はIBM p690でおこなったそうです)


- 暗号技術入門 ―― 秘密の国のアリス
(上記の画像は結城浩さんのスクリプトを拝借されていただきました.よく見ると異なる二つのバイナリファイルですが,出力されるハッシュが同じです.)

暗号には「機密性」「完全性」「認証」「否認防止」という四つの条件が必要とされていますが,今回の話で「完全性」「認証」「否認防止」に問題あることになってしまいました.この問題がすぐすぐユーザさんのところで発生する問題ではないと思いますが,プログラマさんや,管理者さんは頭の片隅でもおいておいた方がよさそうです.もしどうしてもMD5とか使うのが怖いなと感じるようならSHA256やSHA512などビット長の長い,まだ破られていない関数を利用するものアリだと思います.

しかし今回言いたいのはこのように「完全ではない」という事を証明されて,また強い暗号が開発されてゆく所にあります.まるで麦踏みです.しかし,そのおかげで僕たちは危険なネットワークの海を何事もないかのごとく過ごす事が出来るのですから.