web-dev-qa-db-ja.com

パスワードのハッシュ、ソルト、ハッシュ値の保存

ハッシュ化されたパスワードをDBMSに保存する方法を自由に決定できるとします。このようなスキームには明らかな弱点がありますか?

DBMSに格納されているハッシュ値を作成するには、次のようにします。

  • ソルトの一部としてのDBMSサーバーインスタンスに固有の値、
  • そして、ソルトの2番目の部分としてのユーザー名、
  • そして、実際のパスワードを使用してソルトの連結を作成します。
  • そして、SHA-256アルゴリズムを使用して文字列全体をハッシュします。
  • そして、結果をDBMSに保存します。

これは、衝突を考え出したい人は、ユーザー名ごととDBMSサーバーインスタンスごとに別々に作業を行う必要があることを意味します。新しい [〜#〜] nist [〜#〜] 標準を使用できるように、実際のハッシュメカニズムをある程度柔軟に保つ予定です。まだ作業中のハッシュアルゴリズム( SHA-3 )。

「DBMSサーバーインスタンスに固有の値」は秘密である必要はありませんが、何気なく漏らされることはありません。意図は、誰かが異なるDBMSサーバーインスタンスで同じパスワードを使用した場合、記録されたハッシュが異なることを保証することです。同様に、ユーザー名は秘密ではなく、適切なパスワードだけです。

最初にパスワードを、次にユーザー名と「一意の値」を使用すること、または3つのデータソースのその他の順列を使用することに利点はありますか?または、文字列をインターリーブするのはどうですか?

上記の情報だけでなく、ランダムなソルト値(パスワードごと)を追加(および記録)する必要がありますか? (長所:ユーザーはパスワードを再利用できますが、おそらくデータベースに別のハッシュが記録されます。短所:ソルトを記録する必要があります。長所が短所を大幅に上回っていると思います。)

関連するSOの質問がかなりたくさんあります-このリストは包括的ではない可能性があります:

これらの質問への回答は私のアルゴリズムをサポートしていると思います(ただし、単にランダムソルトを使用する場合、「サーバーごとの一意の値」とユーザー名コンポーネントはそれほど重要ではありません)。

38

塩はランダムでユニークである必要があります。それは攻撃者を助けないので、それは自由に知られています。多くのシステムは、ハッシュ化されたパスワードのすぐ隣の列のデータベースにプレーンテキストのソルトを格納します。

ソルトは、2人のユーザー(ユーザーAとユーザーB)がたまたま同じパスワードを共有した場合にそれが明らかでないことを保証するのに役立ちます。各パスワードにランダムで一意のソルトがないと、ハッシュ値は同じになり、明らかにユーザーAのパスワードが解読された場合、ユーザーBは同じパスワードを持っている必要があります。

また、ハッシュの辞書を既知のパスワードと照合できる攻撃からの保護にも役立ちます。例えばレインボーテーブル。

また、「作業係数」が組み込まれたアルゴリズムを使用すると、計算能力が向上するにつれて、ハッシュを作成するためにアルゴリズムが実行する必要のある作業も増加する可能性があります。たとえば、 bcrypt です。これは、ブルートフォース攻撃の経済性が受け入れられなくなることを意味します。おそらく、既知のハッシュのテーブルの作成は、作成に時間がかかるため、はるかに困難になります。 「作業係数」の変動は、より多くのテーブルを作成する必要があることを意味します。

31
Colin Mackay

あなたは問題を複雑にしすぎていると思います。

問題から始めます:

  1. 弱いパスワードを保護しようとしていますか?
  2. レインボー攻撃を軽減しようとしていますか?

提案するメカニズムは、単純なRainbow攻撃から保護します。これは、ユーザーAとユーザーBが同じパスワードを持っていても、ハッシュされたパスワードが異なるためです。非常に複雑なパスワードをソルトするのは、かなり手の込んだ方法のように思えます。

  • DBを別のサーバーに移行するとどうなりますか?
    • DBごとの一意の値を変更できますか?変更した場合、グローバルRainbowテーブルを生成できます。変更しない場合、DBを復元できません。

代わりに、列を追加して適切なランダムソルトを保存します。これにより、あらゆる種類のレインボー攻撃から保護されます。複数の展開にわたって。

ただし、ブルートフォース攻撃からユーザーを保護することはできません。したがって、パスワードがお粗末なユーザーを保護しようとしている場合は、他の場所を探す必要があります。たとえば、ユーザーが4文字のパスワードを持っている場合、ソルトと最新のハッシュアルゴリズムを使用しても、数秒で解読される可能性があります。

19
Sam Saffron

「ランダムなソルト値を生成して保存するだけでなく、これをより複雑にすることで何が得られることを望んでいますか?」アルゴリズムを複雑にするほど、不注意で弱点を導入する可能性が高くなります。これは、私がどのように言っても、おそらく卑劣に聞こえるかもしれませんが、それは有益な意味があります-あなたのアプリの何が特別なので、新しいパスワードハッシュアルゴリズムが必要ですか?

7
Peter Recore

パスワードにランダムなソルトを追加し、その組み合わせをハッシュしてみませんか。次に、ハッシュとソルトを1バイト[]に連結し、それをデータベースに格納しますか?

ランダムソルトの利点は、ユーザーがユーザー名を自由に変更できることです。ソルトは辞書攻撃を防ぐために使用されるため、秘密にする必要はありません。

6
Paul van Brenk