ぷ~ろぐぷ~ろぐ身辺雑記、アニメ・マンガ、Jリーグ(特に新潟)のこととか。2014PHPメモ041:パスワードのSalt付きハッシュ値Salt(ソルト)とはSaltはパスワードのハッシュ値を生成する際に元のデータに付与する文字列である。ハッシュ関数(パスワード+Salt)Saltをユーザ毎に異なる値にすれば、同じパスワードでもハッシュ値はそれぞれ異なる値となる。Saltを付与してハッシュ値を生成した場合、ハッシュ値だけでなくSaltも保存しておかなければならない。入力されたパスワードの検証ではハッシュ関数(入力されたパスワード+Salt)でハッシュ値を求めて、システムが持つパスワードのハッシュ値と比較する。よって、Saltがないとパスワードの検証ができない。「パスワード+Salt」から生成したハッシュ値の利点はレインボーテーブルによるオフライン攻撃に対して強くなることである。レインボーテーブルとはハッシュ値とパスワードの、巨大な対応表(逆引き表)である。インターネットで公開されているものもある。Saltを付与しないで生成したハッシュ値では、このレインボーテーブルを使って高速にハッシュ値から平文のパスワードを見つけられる可能性がある。対して「パスワード+Salt」のハッシュの場合、Saltはシステムやユーザ毎に違うのでレインボーテーブルの有効性が著しく下がる。オフラインの総当り攻撃(ブルートフォース攻撃)にはほとんど効果がない。オフライン攻撃、総当り攻撃については参考サイト1を参照。いう関数が用意されているのでそれを使う。どちらの関数も戻り値にSaltが含まれているので、別途Saltを保存しておく必要はなく関数の戻り値を保存しておけばよい。戻り値の形式は参考サイト2の下の方で説明されている。簡単に説明すると最初の4桁がハッシュを求めるためのアルゴリズムの指定、次の3桁がコスト(ストレッチングの回数)の指定、その後がSaltとハッシュ値になっている。ストレッチングについては参考ページ1を参照。前記のようにこの値は「<ハッシュを生成する方法の指定>+<Salt>+<ハッシュ値>」となっているが、別にコード中で分解したりくっつけたりする必要なく全体をハッシュ値として扱えばよい。アルゴリズムにBlowfishを指定する場合、最初に渡すSaltは以下のような形式である。5.3.7以降で使用できる。指定できるが、セキュリティ上問題があるとPHPのドキュメントでは説明されている。値を返しており、エラーやワーニングも出ず表立って不都合はなかった。ハッシュ化に関連するモジュールが更新されているんだろうか?続くコストの指定には4~31を指定できる。固定長2桁で、10未満の値を指定する場合は前ゼロを付ける(4の場合は"04")。