昨日のパスワードとソルトの話の続き。

なんかエラソーなことを書いてしまったが、封筒の裏の計算ぐらいはしておくべきだとふと思った。実際、どれぐらいの時間でパスワードというのは突破されるのか?
・パスワードのハッシュ計算はSHA1、パスワードの平均長は8文字と仮定する
・攻撃者は1000個程度のありがちなパターンを持っていて、組み合わせや文字の入れ替えでざっくりその自乗、1000000個程度のパスワードパターンを生成し、辞書攻撃を仕掛けるとする
・流出されたデータの件数は発表通り25万件とする

1000000個のパスワードパターンからハッシュ値を計算するのにかかる時間はどれぐらい? 見当もつかないが、pythonの timeit を使い、 timeit.timeit('m = hashlib.sha1(); m.update("abcdefgh"); m.hexdigest()', setup='import hashlib', number=1000000) などと実行したところ、だいたい3秒程度で計算が完了した。
実行環境はAWSなため遅く、pythonを使っている、などのオーバーヘッドは全然無視できないところだと思うが、実環境ではこの数倍程度の速さかなあと概算する。
ソルトがある場合は使い回しができないのでマッチングにはこの25万倍の時間がかかり、すなわち 3 * 250000 は210時間弱、8日半程度だ。10倍速い環境だったとしても、1日弱程度はかかる。

実際には25万件のデータのインデックスを作って比較をするのが馬鹿にならないと思われる。だが、大雑把に次のような印象を受けた
・パスワードハッシュだけでは、実際の流出に際した問題という意味ではほぼ意味がない。辞書攻撃に使うパターンは数秒で生成できるため、準備を含めても、数時間以内に辞書攻撃は完了してパスワードは割り出せる
・ソルトがあっても、25万件程度であれば数日内に解析は完了する
・つまり、ソルトの有無にはちょっとした意味がある。ソルトなしのハッシュが流出した場合、この問題が露見して即座にアナウンスを作り、報道されても、そのころにはすでに手遅れである可能性が高いが、ソルトがあれば猶予がある可能性も高い

ただ、あくまで繰り返すと、「暗号化」(ハッシュ値だけを保存すること)には強い意味がある。生パスワードであれば流出した瞬間に全員が即アウトだが、辞書攻撃であれば、コンピュータが推定するパターンには合致しないパスワードを使っていたら、そもそも破られることはない。もちろん、攻撃者によって思いもよらずパスワードにマッチしてしまう危険性はあるわけで予断は禁物なのだが。
Shared publiclyView activity