web-dev-qa-db-ja.com

ソルトパスワードハッシュを使用すると、同じパスワードの無塩ハッシュを簡単に解読できますか?

同じアカウントでパスワードを再利用しないようにするシステムを実装するように求められました。

私がこれを行う最も安全な方法は、パスワードのハッシュと既知のソルトを比較することです。 bcrypt.hash(sha256(password), user.savedSalt))

システムの残りの部分では、別のソルト処理されたsha256-bcrypt.hash(sha256(password), 10)を使用します。

これらの2つのハッシュはそれぞれ、元のパスワードに関する異なる情報を明らかにします。

両方を使用すると、既知のソルトハッシュを簡単に解読できますか?

2
Michael Cole

同じソルトを使用して複数のパスワードのハッシュを保存している場合、ソルトを使用する目的に反しています。 salt mustはパスワードごとに一意である必要があります。そうでない場合、攻撃者はH(password || salt)を1回だけ計算できます各候補パスワードについて、結果のダイジェストをデータベース内のすべてのハッシュと比較します。これらはすべて同じsaltを使用しているためです。

また、コメントで述べたように、コストパラメータを他のものと混同しているようです。 "10"は、bcrypt操作にかかる計算量を指定します。値を大きくすると、操作の計算コストが増えるため、攻撃者のコストが増加します。

重複するパスワードをチェックしたい場合は、このような自作のスキームを考え出す必要はありません。本当に必要な場合は、提供されたパスワードを取得して、最初のユーザーのソルトと連結し、ハッシュして、保存されているハッシュと比較できます。一致しない場合は、2番目のユーザーについても同じようにします。これは、設定された新しいパスワードごとにデータベース全体をウォークスルーする必要があることを意味しますが、完全に重複するパスワードを検出します。

3
forest