既存のパスワードハッシュにソルトをどのように追加しますか?
質問
ハッシュされる前にソルトが追加されていないハッシュされたパスワードのデータベースがあります。新しいパスワードにソルトを追加したい。明らかに、既存のものを再ハッシュすることはできません。
新しいハッシュシステムにどのように移行しますか?
解決
もちろんできます。既存のハッシュにソルトを追加して、もう一度ハッシュします。もちろん、これには同じプロセスを通過するために将来のログインが必要になります。つまり、2つのハッシュ関数を呼び出す必要がありますが、多くの正当なパターンがとにかくこれを行うので、あなたが思うほど悪臭はありません。
パスワードの塩漬けは、レインボーテーブルに対する防御策です。この場合、塩は秘密である必要はありません。
http://en.wikipedia.org/wiki/Rainbow_tables#Defense_against_rainbow_tables
実際に記事で見ることができます
hash = MD5 (MD5 (password) . salt)
これは、使用する方法とまったく同じ方法です。 (別のハッシュ関数を除く。)
他のヒント
簡単な修正として、データベースにソルト列を作成し、ユーザーが古いハッシュと正しく一致してログインすると、ソルトで入力したパスワードを使用して新しいハッシュを作成できます。
ユーザーが old (ソルトなし)または new (ソルト付き)ハッシュを持っているかどうかを示すフラグで構成される列を追加できます。
その時点で、すべてのユーザーにサインイン時にパスワードの変更を強制することをお勧めします。この方法で、最終的にその列を削除できます。
複数のハッシュ手法を含む同様の問題に対処しました。データベース内のハッシュメソッドタイプ(つまり、「アルファ」、「ベータ」、「ガンマ」、「デルタ」)をエンコードするアプローチも使用しました。現在のすべてのハッシュを適切なレベルでマークしました。ユーザーがログインしたときに、更新されたメソッドを使用してパスワードを検証し、再ハッシュしました。パスワードは90日後に期限切れになるため、古い方法を使用しているすべてのパスワードがリセットされるまで、3か月間待つだけでした。
ここにいくつかの方法があります。あなたのために働きます。
既存のハッシュに追加する定数パターンは役に立たないことを覚えておいてください(そのリンクのトリックの1つはそのようなものを示唆しています)。塩を分離するために使用できる識別可能なパターンはありません。
もちろん、最善の方法はソルトハッシュテーブルに移行することです。
" salted"という名前のデータベースに新しいフィールドを作成します。 true / falseのタイプ(またはDBMSに相当するもの)。既存のハッシュのすべての値をfalseに設定します。新しい、塩漬けのハッシュが追加されるたびに、「塩漬け」を設定します。フィールドをtrueにします。
次に、あなたがしなければならないのは、コード内で2種類のハッシュを別々に処理することです。
これは特定の解決策よりも一般的な解決策ですが、問題を解決する必要があります。
ソルトをハッシュ内に保存する場合、ハッシュの長さをチェックしてソルトが含まれているかどうかを判断するのはかなり簡単です。ソルトがない場合はパスワードをハッシュし、ソルトがある場合はパスワード+ソルトをハッシュします。
データベースにブール列は必要ありません。
ソルトを保存する最良の方法は、作成したパスワードハッシュ+ソルトにソルト値を埋め込むことです。ハッシュの先頭または末尾にソルト文字列を追加せず、ソルトを文字通りハッシュに埋め込みます。