salt
暗号理論におけるソルトとは、ハッシュ処理の際に追加するデータのことです。 事前に計算済みのハッシュとその元入力の対応表 (レインボーテーブル) で出力を解析される可能性を減らすために利用します。
端的に言うと、ソルトとはちょっとした追加データです。 これをつけるだけで、ハッシュをクラックするのが劇的に難しくなります。 事前に計算済みのハッシュとその元入力を大量にまとめた表(引用者注:レインボーテーブル)が、オンラインで多数公開されています。 ソルトを使えば、そのハッシュ値がこれらの表に含まれている可能性を大きく減らすことができます。 password_hash() は、ソルトを指定しなかった場合にはランダムなソルトを作ります。 一般に、これがいちばんお手軽で安全なアプローチでしょう。
@ockeghem: ソルト化ハッシュが話題になっているので、ソルトに対する理解度測定試験問題を作りました。ふるってご参加ください。現在の知識で「これかな?」で答えていただけると幸いです。 【問題】パスワードをハッシュ値で保存する際のソルトはどこに保存するのが一般的な実装ですか?
機密性の高いファイルに保存して環境変数で渡す 27.2%
ハッシュ値と共にデータベースに保存する 33.9%
ハードウェアセキュリティモジュール(HSM)に保存 15.7%
ソルトは保存せず毎回ランダムに生成する 23.3%
ソルトはどのように保存すればいいのですか?
password_hash() や crypt() を使った場合、戻り値であるパスワードハッシュの中にソルトが含まれています。 このソルトは、そのままの形式でデータベースに格納する必要があります。
というのも、利用したハッシュ関数の情報がそこに含まれており、それを直接 password_verify() や crypt() に渡せばパスワードの検証ができるからです。