バレにくいパスワード生成関数の作り方。


ハッシュとソルト、ストレッチングを正しく理解する:本当は怖いパスワードの話
http://www.atmarkit.co.jp/ait/articles/1110/06/news154_2.html

オフライン攻撃の前提として、すべてが「ばれている」と想定する
ハッシュ値のほか、ハッシュアルゴリズム、ソルト(後述)、ストレッチングの有無や回数(後述)はすべて攻撃者に「ばれている」状態で、それでも元の(平文の)パスワードが保護できるかを考えるべきです。

MD5だから危険なのではない
「MD5だから危険なのであって、SHA-256などを使えば安全なのだろう」と思った人も少なくないのではないでしょうか。
しかし、これは誤解なのです。GPUによる総当たりも、レインボーテーブルも、MD5特有の性質を利用した手法ではありません。
たとえSHA-256やSHA-512を用いたとしても、安全というわけではありません。

対策1:ソルト
サイト側の対策として、まずソルト(Salt)は必ず採用すべきです。ソルトというのは、ハッシュ値を計算する前にパスワードの前後に付け加える短い文字列です。

対策2:ストレッチング
ストレッチングというのは、ハッシュ値の計算を何回も(1000回〜数万回程度)繰り返すことです。
一般にハッシュ関数は高速性を求められますが、この高速性は総当たり攻撃に対しては脆弱な方向に働きます。総当たりに要する時間も短縮されるからです。
仮にストレッチングを1万回とすると、先に紹介した「8文字英数字のパスワード」のハッシュ値をすべて求めるのには30万時間、約34年かかることになります。

暗号化の併用も可能
攻撃者によってすべての情報が盗まれるという前提に立つと、パスワードを安全に守る現状のベストプラクティスは「ソルト+ハッシュ+ストレッチング」です。しかし、この方法で将来にわたって安心というわけではありません。