2009-07-29 9 views
12

私はハッシュされる前に塩が加えられていないハッシュされたパスワードのデータベースを持っています。私は新しいパスワードに塩を追加したい。明らかに私は既存のものを再ハッシュすることはできません。既存のパスワードハッシュに塩をどのように追加しますか?

どのように新しいハッシュシステムに移行しますか?

+0

実際にパスワードをハッシュしていますか、もっと複雑なものはありますか?コーディングエラーのため、私は同様のボートに入っていますが、元のコードは "1" + loginname + "" +パスワードを実際にハッシュします。これはレインボーテーブルをむしろ実行不可能にするほど複雑です(特に、loginnameは、選択された)。 –

+0

私はパスワードをまっすぐにハッシュしていました。既に塩を加えたようです。塩に加えて、ログイン名を追加しているので、同じパスワードが同じハッシュにならないため、あなたの方法は良いようです。 –

答えて

31

もちろん可能です。単に既存のハッシュに塩を追加し、再度ハッシュします。もちろん、これは将来のログインが同じプロセスを通過することを必要とします。つまり、2つのハッシュ関数を呼び出す必要がありますが、正当なパターンがたくさんあるので、あなたの思うほど悪い臭いはありません。

パスワードのソルトは、レインボーテーブルを防御するための努力です。この場合、塩は秘密である必要はありません。

http://en.wikipedia.org/wiki/Rainbow_tables#Defense_against_rainbow_tables

あなたが実際にあなたが使用されるのと同じ正確な方法はある記事

hash = MD5 (MD5 (password) . salt) 

で見ることができます。 (異なるハッシュ関数を除く。)

+0

+1 - 私はこれが私が思っていたよりも好きです。 –

+0

興味深い考えです。あなたは何とかセキュリティを妨げないと確信していますか?特にこの方法では、2番目のハッシュの後に文字列を取得する人は前のステップについての情報が多く(たとえば一定の長さのように)、彼が塩を見つけるのを助ける可能性があります。 –

+3

塩は秘密ではありません。実際には、ユーザーごとに(プレーンテキストで)保存する必要があります。 –

2

ユーザーが古い(無塩)または新しい(塩と)ハッシュを持っていないかどうかを示すフラグから成る、列を追加することができます。

その時点で、すべてのユーザーがログイン時にパスワードを変更するようにすることをお勧めします。この方法で、最終的にその列を削除することができます。

+0

、またはカラムをhash_type(nosalt、md5、sha1、sha512)にしてください。もしそれが 'nosalt'ならば、他のものがあれば、塩柱が使用され、比較のために使用される塩柱があります - MD5が既に弱体化しているので)。 –

14

データベースにsalt列を作成し、ユーザーが古いハッシュと正確に一致すると、saltで入力したパスワードを使用して新しいハッシュを作成できます。

+0

ああ、それは悪い良い考えのように聞こえる –

+0

これは私のアプローチでもあります。リファクタリングは、過去のコードを確実に拡張し、実際には、データベース・レベルでも実行する必要があります。 –

+0

+1、優れた体系。 – nik

0

some ways hereがあります。
既存のハッシュに追加する定数パターンは無用です(そのリンク上のトリックの1つは、そのようなものを示唆しています)。塩を単離するのに使用できる識別可能なパターンは存在してはならない。

もちろん、塩漬けのハッシュテーブルに移行するのが最善の方法です。

0

新しいフィールドを作成するには、「salted」という名前のデータベースをtrue/falseのタイプ(またはDBMS内の同等のもの)で作成します。既存のハッシュのすべての値をfalseに設定します。新しい塩漬けハッシュが追加されるたびに、「塩漬け」フィールドをtrueに設定します。

次に、コード内で2種類のハッシュを別々に処理するだけです。

これは特定の解決策よりも一般的な解決策ですが、問題を解決するはずです。

0

ハッシュ内に塩を格納する場合は、ハッシュの長さをチェックして塩が含まれているかどうかを判断するのはかなり簡単です。塩がない場合はパスワードをハッシュし、塩があればパスワード+塩をハッシュします。

データベースにブール型の列は必要ありません。

0

私が私の塩を保存する最良の方法は、私が作成したパスワードハッシュ+塩の中に塩の値を埋め込むことです。私はハッシュの最初または最後にソルトストリングを付加しません。文字通りハッシュにソルトを埋め込みます。

+0

塩はどのように使用されるのでしょうか?私があなたを誤解していないことを確かめるために、ハッシュ(塩+パスワード)を意味しますか? – Gary

1

私は、複数のハッシュ技術を含む同様の問題を扱っていました。私は、データベースにハッシュメソッドタイプ(つまり、 'アルファ'、 'ベータ'、 'ガンマ'、 'デルタ')をエンコードするアプローチを使用しました。私はすべての現在のハッシュを適切なレベルでマークしました。ユーザーがログインすると、私は自分のパスワードを検証し、更新された方法でパスワードを再ハッシュしました。私たちのパスワードは90日後に失効するので、古い方法を使用していたすべてのパスワードがリセットされるまで3ヶ月間保持するだけでした。

関連する問題