MD5の逆引きの話

PerlCPANに、こんなライブラリがあった。

Digest-MD5-Reverse-1.3
http://search.cpan.org/~blwood/Digest-MD5-Reverse-1.3/

要はMD5の得られたハッシュ値から、MD5に渡された値を得られる機能を持つらしい。
ソースのサンプルはこんな感じ。

    use Digest::MD5::Reverse;
    print "Data is ".reverse_md5("acbd18db4cc2f85cedef654fccc4a4d8")."\n";    
    # Data is foo

なんで、こんなことができるのかな?と、思いつつソースとかドキュメントを読むと、世界各地で公開されているハッシュ値が収められた辞書を運営しているWebサービスがあってそこにリクエストを出して、逆引きの結果を読んでいるらしい。
なるほど、それであれば確かに不可能ではないのはわかる気がする。


で、もっとお気軽に逆引きする方法がblogに紹介されていた。

あまり感心しない用途だとは思われますが、MD5 Hash 値を逆変換したい、と思ってる人に朗報です。Hash 値を Google で検索してみてください。結構な確率でヒットするそうな。つっても Salt 無しの場合だけですけど。
MD5破りにGoogleを活用 - Rauru Blog

なるほど...。ちょっと試してみた。
たとえば、"digital"という文字列をMD5に通すと、次の値が得られる。

<?php
print md5("digital");
?>

こうすると出力されるhash値は、"e0e1d64fdac4188f087c4d44060de65e"という値だ。
これを、googleの検索ワードとして渡してやると、次の結果が得られる。
f:id:hideack:20090114224523j:image


まぁ、ものの見事に見つかりましたがな。
なので、MD5そのものの強さ云々という問題もありますが、そもそもハッシュ関数を通して何かするときは、saltを対象文字列に付与しておきましょうということで。