ブログが続かないわけ | MD5は復号できる!?
http://en.yummy.stripper.jp/?eid=719489
Digest::MD5::Reverseは、あくまで
「おなじハッシュ値をもつデータを引っ張ってくる」
だけで別に復号できるわけじゃないよね。
元データ:a
に対して、
aのハッシュ値:f(a)
だとすると、
f(a) = f(b)
となる
別のデータ:b
を出してくると(※もちろんa=bの可能性もある)。
ただし、ハッシュ関数の特性として実用的な時間内にbを算出するのは難しいので、一種のブルートフォースを行えるようあらかじめデータベースに
ハッシュ値:データ
の表を蓄積している、と。やり方としてはMD5以前にDESでパスワード保存していたころのcrackとあんまかわらない。
「こういうものがあると
ハッシュ値を使ったパスワード検証の土台が揺らぐ」
かというと、そんなこともないよね。
パスワードaに対して単純にハッシュ値f(a)を保管していてこの値が漏洩した場合は、f(a)=f(b) となる偽パスワードbを提示されるだけで突破されてしまうが、秘密の文字列s(漏れないことが前提)を用意して
f(a+s)
を保存しておくようにすれば、仮にf(a+s)が通信経路などからバレ、汎用のデータベースからf(a+s)=f(b)となるbを抽出して認証に使われたとしても、
・f(b+s)を算出
・f(a+s)≠f(b+s)なので認証失敗
ということになる。sじゃなくてf()を単純なMD5でない(MD5以上に信頼できる)関数f'()にしても可。ハッシュの表が用意されていなければいい。イタチごっこ的な部分もあるけど。
というかWebアプリケーションの認証って、ふつーこうやってるんだとばっかり思ってた。だからMD5の逆引き自体は驚くことでもなんでもなくて、前提にしてシステムの設計をしなきゃいけないもんだと。
というような感じだと思うけど…ぶんけいなのでぼくよくわかりません。うのみにするとしぬことがあります。しかしプロバイダに就職する人はたいへんだよね…むかしの同期が某ネットでメールを大量に消したことを思い出す…。
#なんでウチのAdSenseは「フェミニーナ軟膏」とかが表示されるんだ?
※追記
まともに突っ込んでくれてる方がいらした↓参考になる
パスワードの保存に SMD5 (Salted MD5) や SSHA1を使う (MD5 への辞書攻撃とか) - まちゅダイアリー (2007-10-23)
http://www.machu.jp/diary/20071023.html#p01
あー…ちゃんとしたやり方ならsalt(sはstringじゃなくてsaltのsのつもりだった)は漏れても大したインパクトないのかー。まあ、/etc/passwdもそうだったもんね…。
たぶん、sはソースコードにハードコーディングして、f(a+s)がSQLインジェクションで漏洩した場合のこと?
「ハードコーディングすりゃ漏れないだろ」という安易な発想で書いていたのはそのとおり^^; f(a+s)はインジェクションに限らず通信経路で丸見えだろう、という感じ…これはぼくが元エントリの「ローカルにパスワードを保存する形式についての話」と、Web API系認証サービスの話をごっちゃにして書いてるからです(いばるな)。
辞書攻撃の場合、基本的にはa=bのはず。パスワードに使うような文字列でa!=bってのはない気がする。
そんな気もするけど、どっちかというとa!=bであってほしい気もする^^;
