2009-07-27 2 views
38

ハッシュ化されたパスワードをDBMSに格納する方法を自由に決めたとします。このような計画に明らかな弱点はありますか?ハッシュ値のパスワードハッシング、ソルト、およびストレージ

DBMSに格納されているハッシュ値を作成するには、取る:

  • 塩の一部としてDBMSサーバーインスタンスに固有の値、
  • とユーザー名の第二部として、塩、
  • そして、実際のパスワードとの塩の連結を作成し、
  • そして、SHA-256アルゴリズムを使用して文字列全体をハッシュ、
  • そしてDBMSに結果を格納。

これは、衝突を起こしたい人は、それぞれのユーザー名と各DBMSサーバーインスタンスに対して個別に作業を行う必要があることを意味します。私は実際のハッシュメカニズムを幾分柔軟にして、新しいNIST標準ハッシュアルゴリズム(SHA-3)の使用を可能にする予定です。

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

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

上記の情報と同様にランダムな塩分(パスワードごと)を追加(記録)する必要がありますか? (利点:ユーザーはパスワードを再利用することができますが、おそらくデータベースに記録された別のハッシュを取得することがあります)欠点:塩が記録されなければならないという欠点をはるかに上回っていると思われます。

ありますSO関連の質問のかなり多く - このリストは包括的になることはほとんどありません:

Salt generation and Open Source software

  • Password hashes: fixed-length binary fields or single string field?
  • 私はこれらの質問に対する答えは、(私のアルゴリズムをサポートしていることだと思うけれども、あなたは単にランダムな塩、その後、「サーバごとに固有の値」とユーザ名のコンポーネントを使用している場合重要度は低い)。

    +1

    ランダムな部分は、予測攻撃を防ぐことが重要です。 – Jacco

    +0

    http:// stackoverflowを追加できます。com/questions/1645161/salt-generation-and-open-source-software/1645190#1645190を記事リストに追加 – Jacco

    +0

    さらにhttp://dba.stackexchange.com/questions/7492/password-hashes-fixed-length- [dba.se]サイトへのリードインとしてバイナリフィールドまたはシングルストリングフィールド – jcolebrand

    答えて

    31

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

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

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

    また、「作業係数」を組み込んだアルゴリズムを使用することは、演算能力が向上するにつれて、アルゴリズムがハッシュを作成するために必要な作業も増やすことができることを意味します。たとえば、bcryptとなります。これは、ブルートフォース攻撃の経済性が維持できなくなることを意味します。おそらく、既知のハッシュのテーブルを作成するのは、作成に時間がかかるため、はるかに難しくなります。 「作業要素」の違いは、より多くのテーブルを構築する必要があることを意味します。

    +5

    ソルトはまた、虹のテーブルベースの攻撃から私たちを守ります –

    +0

    はい、私が他の回答にコメントしているように、私はそれを書いている間に質問が変わってしまいました。ランダムな塩が必要であることを認識しましたが、それでも十分であることを反映する時間はかかりませんでした。ミックスにユーザー名を追加すると、ハッシュアルゴリズムが処理しなければならないデータが長くなり、短いパスワードを保護できます。その余分な保護が本当にいかに現実的であるかわかりません。 –

    +10

    この回答は間違っています。塩の目的は*ではないので、 "共有パスワードは明白ではありません"。辞書の攻撃をもっと困難にすることを目的としています。 (このような危険な誤った反応を「回答」としてマークすることは、このサイトの致命的な設計上の瑕疵です。) –

    6

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

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

    +2

    +1は、ユーザーが自分のユーザー名を自由に変更することができなくなったということです。 –

    +0

    @pb:この文脈では、ユーザーに名前を変更してもらいたくありません。状況によっては価値があるかもしれませんが、このアプリに関する限り、ユーザーの名前は固定されています(正確には、ユーザーが名前を変更すると新しいユーザーになります)。ちょうどランダムな塩とパスワードを使用して、おそらくOKです。私はハッシュアルゴリズムが歯を入れるのに十分な材料があることを少しは心配しています。それは単に塩以上のものを加える理由のもう一つの部分です。私が質問を書いたとき、私はランダムな塩が必要であることを実感した。私はそれが十分であったことに気付かなかった。 –

    +0

    ユーザーは引き続きユーザー名を変更できますが、その時にパスワードを再ハッシュする必要があります。一方、ランダムな塩を使用することは、非ランダムな塩を使用することと同じかそれ以上の利点を有する。 – wprl

    19

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

    スタート:

    1. あなたが弱いパスワードを保護しようとしていますか?
    2. 虹の攻撃を緩和しようとしていますか?

    単純なレインボー攻撃から保護するメカニズムは、ユーザーAとユーザーBが同じパスワードを持っていてもハッシュされたパスワードが異なります。それは、あまりにも複雑なパスワードを塩漬けするために、やや精巧な方法のように思えます。

    • DBを別のサーバーに移行するとどうなりますか?
      • DB単位で一意の値を変更することができます。そうでない場合は、グローバルな虹の表を生成できます。そうでなければ、DBを復元できません。

    代わりに、私はちょうど余分な列を追加し、適切なランダムな塩を格納します。これはどんな種類の虹の攻撃に対しても保護します。複数の展開にわたって

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

    +0

    良い答え。10Kで投票して欲しい! –

    +0

    :pありがとう! –

    +1

    私はあなたがうまくいくかもしれないと思います。質問を書いたように、私はランダムな塩が必要であることを実感しました。私はそれが十分であったことに注意する時間をとらなかった。だからこそ、一つの関心事は、ハッシュアルゴリズムにもっと多くのデータを渡すことであり、ユーザー名は塩のように少し役立ちます。別のDBMSサーバー・インスタンスへのリカバリは有効な問題です。その下でユーザー名と塩が問題なく、ユーザー名は100%必要ではありません。ありがとう。 –

    7

    あなたは自分自身に質問する必要があると思います。「ランダムな塩分値を生成して保存するよりも、これをもっと複雑にすることで、何を得ることを望んでいますか?アルゴリズムを複雑にするほど、不注意に弱点を導入する可能性が高くなります。これはおそらく私がそれを言うにかかわらずsnarkyと思うかもしれませんが、それは有用であることを意味しています - あなたのアプリを特別なものにするためには、派手な新しいパスワードハッシュアルゴリズムが必要ですか?

    +0

    @Peter:犯行はありません - 私はあなたが言っていることを理解しています。私が書いていた「何が違うのか」の1つの側面は、「同じパスワードを持つ異なるサーバーが異なるキーを保管していることを確認する」でした。他のコメントに書かれているように、私は質問の終わり近くに、ランダムな塩が必要であることを認識しました。私はそれが十分であるとは思わなかった。また、ハッシュの余分なデータは、短いパスワードと貧弱なパスワードを保護するのに役立ちます。私が評価することができないのは、どのくらいの違いがあるかです。 –

    +0

    継続:塩が8バイトの整数で、パスワードが1文字の場合、SHA-256ハッシュは実際にそれを十分に保護しますか?ユーザー名が3文字で、「サーバー固有の」データが32文字のランダムに決定された(しかし固定された)文字列だった場合、データを保護するのに役立ちます。 (9バイトは虹の攻撃を受ける可能性があり、44バイトはおそらく攻撃されにくい)たぶん 'サーバ固有のもの'は '固定された32バイトの文字列'である必要があります。 ... –

    +0

    継続(2):...または多分それは64バイト(または32バイト、またはいくつかの他の数)固定文字列で '塩とパスワードを'パッドする必要がありますか?それとも、これは大ガチョウの追跡です。それは本当に重要ではありません。 –

    関連する問題