91

更新: 私は最近、この質問から、以下の議論全体で、私 (そして他の人もそうだったと確信しています) が少し混乱していることを知りました: 私がレインボーテーブルと呼んでいるものは、実際にはハッシュテーブルと呼ばれています. レインボー テーブルはより複雑な生き物であり、実際にはヘルマン ハッシュ チェーンの変形です。答えは同じだと思いますが (暗号解読に帰着しないため)、議論の一部は少し歪んでいる可能性があります。
質問: 「レインボー テーブルとは何ですか。どのように使用されますか?


通常、レインボー テーブル攻撃から保護するなど、ハッシュ関数 (パスワードなど) で使用するために、暗号的に強力なランダム値をソルトとして使用することを常にお勧めします。

しかし、ソルトがランダムであることが実際に暗号学的に必要なのでしょうか? この点で、任意の一意の値 (userId など、ユーザーごとに一意) で十分でしょうか? 実際には、単一のレインボー テーブルを使用してシステム内のすべて (またはほとんど) のパスワードをクラックすること
はできません... しかし、エントロピーの欠如はハッシュ関数の暗号強度を本当に弱めますか?


ソルトを使用する理由、ソルトを保護する方法 (必須ではない)、単一の定数ハッシュを使用する (使用しない)、または使用するハッシュ関数の種類については質問していないことに注意してください。
ソルトにエントロピーが必要かどうかだけです。


これまでの回答に感謝しますが、私が(少し)あまり慣れていない分野に焦点を当てたいと思います. 主に暗号解読への影響 - 誰かが暗号数学の PoV から何らかの意見を持っていれば幸いです。
また、考慮されていなかった追加のベクトルがある場合、それも素晴らしい入力です(複数のシステムに関する@Dave Sherohmanのポイントを参照してください)。
それを超えて、理論、アイデア、またはベストプラクティスがある場合は、証拠、攻撃シナリオ、または経験的証拠のいずれかでこれをバックアップしてください. または、許容可能なトレードオフについての有効な考慮事項です... 私はこの件に関するベストプラクティス (大文字の B と大文字の P) に精通しています。これが実際にどのような価値を提供するかを証明したいと思います。


編集:ここでいくつかの本当に良い答えがありますが、@Daveが言うように、一般的なユーザー名のレインボーテーブルに帰着すると思います...そしてあまり一般的でない名前も考えられます。ただし、ユーザー名がグローバルに一意である場合はどうなりますか? 私のシステムでは必ずしも一意ではありませんが、各ユーザーごとに-たとえば、電子メールアドレス。
1 人のユーザー向けに RT を構築するインセンティブはなく (@Dave が強調したように、salt は秘密にされていません)、これでもクラスタリングが妨げられます。唯一の問題は、別のサイトで同じ電子メールとパスワードを使用している可能性があることですが、いずれにせよソルトはそれを防ぎません。
では、暗号解読に戻ります。エントロピーは必要かどうか? (私の現在の考えでは、暗号解読の観点からは必要ではありませんが、他の実際的な理由から必要です。)

4

9 に答える 9

159

ソルトは伝統的に、ハッシュ化されたパスワードのプレフィックスとして保存されます。これにより、パスワード ハッシュにアクセスできるすべての攻撃者にすでに知られてしまいます。ユーザー名をソルトとして使用するかどうかは、その知識に影響しないため、単一システムのセキュリティには影響しません。

ただし、ユーザー名またはその他のユーザー制御値をソルトとして使用すると、システム間のセキュリティが低下します。同じパスワードハッシュアルゴリズムを使用する複数のシステムで同じユーザー名とパスワードを持つユーザーは、同じパスワードハッシュで終わるためです。それらのシステムのそれぞれ。私は攻撃者として、アカウントを侵害する他の手段を試みる前に、標的のアカウントが他のシステムで使用したことが知られているパスワードを最初に試すため、これは重大な責任とは考えていません。同一のハッシュは、既知のパスワードが機能することを事前に教えてくれるだけで、実際の攻撃を容易にするものではありません。(ただし、アカウント データベースを簡単に比較すると、優先順位の高いターゲットのリストが得られることに注意してください。パスワードを再利用している人とそうでない人がわかるからです。)

この考えのより大きな危険は、ユーザー名が一般的に再利用されることです。たとえば、アクセスしたいサイトのほぼすべてに「Dave」という名前のユーザー アカウントがあり、「admin」や「root」はさらに一般的です。これらの一般的な名前を持つユーザーを対象としたレインボー テーブルの構築は、はるかに簡単かつ効果的です。

これらの欠陥は両方とも、パスワードをハッシュする前に 2 番目のソルト値 (標準のソルトのように固定および非表示または公開) をパスワードに追加することで効果的に対処できますが、その時点で、代わりに標準のエントロピー ソルトを使用することもできます。ユーザー名をそれに組み込むこと。

編集して追加: 多くの人がエントロピーについて話し、ソルトのエントロピーが重要かどうかについて話している. それはそうですが、それに関するコメントのほとんどが考えているように見える理由ではありません.

一般的な考えでは、攻撃者がソルトを推測するのが困難になるように、エントロピーが重要であると思われます。これは正しくなく、実際にはまったく無関係です。さまざまな人から何度か指摘されているように、salt の影響を受ける攻撃は、パスワード データベースを持っている人だけが行うことができ、パスワード データベースを持っている人は、各アカウントのソルトが何であるかを確認するだけです。推測できるかどうかは、簡単に調べることができる場合には関係ありません。

エントロピーが重要な理由は、salt 値のクラスタリングを避けるためです。ソルトがユーザー名に基づいており、ほとんどのシステムが「root」または「admin」という名前のアカウントを持っていることがわかっている場合、これら 2 つのソルト用のレインボー テーブルを作成すると、ほとんどのシステムをクラックできます。一方、ランダムな 16 ビット ソルトが使用され、ランダムな値がほぼ均等に分布している場合は、2^16 の可能なすべてのソルトに対してレインボー テーブルが必要です。

攻撃者が個々のアカウントのソルトが何であるかを知るのを防ぐことではなく、潜在的なターゲットのかなりの割合で使用される単一のソルトの大きくて太ったターゲットを攻撃者に与えないことです.

于 2009-02-11T13:28:13.227 に答える
8

ユーザー名だけが問題になる可能性があるのは事実です。ユーザー名は異なる Web サイト間で共有される可能性があるからです。ただし、ユーザーが各 Web サイトで異なる名前を持っていても、問題はありません。では、各 Web サイトで一意にするだけではどうですか。このようにパスワードをハッシュします

hashfunction("www.yourpage.com/"+ユーザー名+"/"+パスワード)

これで問題は解決するはずです。私は暗号解読の達人ではありませんが、高エントロピーを使用しないという事実がハッシュを弱くすることに疑いを持っています.

于 2010-10-26T17:18:18.847 に答える
7

私は、エントロピーの高いレコードごとのランダムなソルトと、レコード自体の一意の ID の両方を使用するのが好きです。

これは、辞書攻撃などに対するセキュリティにはあまり追加されませんが、誰かが自分のソルトとハッシュを別のレコードにコピーして、パスワードを自分のものに置き換える意図を持っているという特殊なケースを取り除きます。

(確かに、これが当てはまる状況を考えるのは難しいですが、セキュリティに関して言えば、ベルトやブレースに害はないと思います。)

于 2009-02-11T13:34:18.987 に答える
3

パスワードごとにソルトが異なる限り、おそらく問題ないと思います。ソルトのポイントは、データベース内のすべてのパスワードを解決するために標準のレインボー テーブルを使用できないようにすることです。したがって、すべてのパスワードに異なるソルトを適用すると (ランダムでなくても)、パスワードごとに異なるソルトが使用されるため、攻撃者は基本的にパスワードごとに新しいレインボー テーブルを計算する必要があります。

この場合、攻撃者はすでにデータベースを持っていると想定されるため、より多くのエントロピーを持つソルトを使用しても、あまり役に立ちません。ハッシュを再作成できるようにする必要があるため、ソルトが何であるかを既に知っている必要があります。したがって、ソルト、またはソルトを構成する値をとにかくファイルに保存する必要があります。Linux のようなシステムでは、ソルトを取得する方法がわかっているため、秘密のソルトを持っていても意味がありません。あなたのハッシュ値を持っている攻撃者は、おそらくあなたのソルト値も知っていると想定する必要があります。

于 2009-02-11T13:51:40.613 に答える
3

ハッシュ関数の強さは入力によって決まるわけではありません!

攻撃者に知られているソルトを使用すると、明らかにレインボー テーブルの構築がより魅力的になりますが (特にrootなどのハードコードされたユーザー名の場合)、ハッシュが弱まることはありません。攻撃者に知られていないソルトを使用すると、システムが攻撃されにくくなります。

ユーザー名とパスワードを連結しても、インテリジェントなレインボー テーブルのエントリが提供される可能性があるため、一連の疑似ランダム文字のソルトを使用して、ハッシュ化されたパスワードと共に保存することをお勧めします。例として、ユーザー名が「potato」でパスワードが「beer」の場合、ハッシュの連結入力は「potatobeer」であり、これはレインボー テーブルの適切なエントリです。

ユーザーがパスワードを変更するたびにソルトを変更すると、長期にわたる攻撃を防ぐのに役立つ可能性があります。これは、大文字と小文字の混合、句読点、最小の長さ、n週間後に変更するなどの合理的なパスワード ポリシーを適用する場合と同様です。

ただし、ダイジェスト アルゴリズムの選択はより重要です。たとえば、SHA-512 の使用は、MD5 よりもレインボー テーブルを生成する人にとっては苦痛であることが証明されます。

于 2009-02-11T12:44:43.583 に答える
1

Salt は、特定の入力値が複数回ハッシュされた場合に、結果として得られるハッシュ値が、達成できる限り近く、常に異なることを保証するために、できるだけ多くのエントロピーを持つ必要があります。

ソルトで可能な限り多くのエントロピーで常に変化するソルト値を使用すると、ハッシュ (パスワード + ソルトなど) の可能性が完全に異なるハッシュ値を生成することが保証されます。

ソルトのエントロピーが少ないほど、同じソルト値を生成する可能性が高くなり、同じハッシュ値を生成する可能性が高くなります。

辞書攻撃やレインボーテーブルが非常に効果的であるのは、入力が既知であり「一定」である場合にハッシュ値が「一定」であるという性質です。結果のハッシュ値を可能な限り変更することにより (高いエントロピー ソルト値を使用することにより)、同じ入力 + ランダム ソルトをハッシュすると、多くの異なるハッシュ値の結果が生成され、レインボー テーブルが無効になります (または、少なくともその有効性が大幅に低下します)。攻撃します。

于 2009-02-11T13:06:36.900 に答える
-1

エントロピーはソルト値のポイントです。

塩の背後に単純で再現可能な「数学」がある場合、それは塩が存在しないのと同じです。時間値を追加するだけで問題ありません。

于 2009-02-11T12:40:59.207 に答える