私はこのトピックに不慣れで、技術的な詳細に進む前に、ソルトハッシュを使用するという概念を知りたいと思いました。
私が理解したことから
したがって、saltのランダムな値により、同じ平文パスワードの2つは同じハッシュ値を持ちません。
ソルトはハッシュパスワードで保存されることがあります。
上記から、
レインボーテーブルが、特定のハッシュ化されたパスワードエントリの単一のソルト値に基づいて構築されているだけです。別のパスワードエントリの場合、関連するソルトに基づいて事前に計算された別のレインボーテーブルを使用する必要があります。
私の理解は間違っていますか?それで、塩は本当に何を助けますか?
あなたの最初の理解から:
あなたの質問について:
目的は、攻撃者にできるだけ多くの仕事をさせることであり、ユーザー(または攻撃者が非常に明確な思想家である場合は、システム管理者)を見つけて、コミットするのではなく、ゴム製のホースで殴るのが簡単になりますRainbowテーブルを計算するための重要なリソース。
余談ですが、MD5はこのコンテキストでは適切なハッシュアルゴリズムではありません。計算するのは簡単です。
シンプルなバージョン:Saltsは、単一ユーザーのパスワードに対するブルートフォース攻撃を阻止しません。ユーザーが停止するのは、すべてのユーザーのパスワードに対して同時にブルートフォース攻撃を実行できることです。
ソルトはブルートフォース攻撃に対しては役に立ちません。攻撃者が男性に知られているすべてのパスワードを発射しているため、彼は最終的に幸運になり、それを正しく推測します。
保存されているパスワードが盗まれたときにソルトが役に立ちます。ハッシュに属するパスワードを見つけるには(MD5は使用しません)、ランダムなパスワードを取得してハッシュし、盗んだパスワードで見つかったハッシュと照合します。 。レインボーテーブルを使用すると、これを大幅に高速化できます。
ただし、ソルトを使用する場合、パスワードを見つけるのではなく、パスワード+ソルトを使用します。つまり、ソルトを減算して実際のパスワードを見つける必要があります。ソルトを使用するポイントは、パスワードごとに異なるパスワードを使用することです。したがって、攻撃者が1つのパスワードをクラックした場合、攻撃者はそれだけを実行し、その1つのパスワードをクラックします。他の誰かが同じパスワードを使用している場合でも、そのハッシュは全然違う。
Saltを使用することは、パスワードを解読することを不可能にすることではありません。同じパスワードが再度使用されたとしても、すべてのパスワードを一意のハッシュとしてチェックする必要があるため、すべてのパスワードを解読するのに時間がかかることです。
すべてのハッシュをクラックするのに時間がかかるようにすることがすべてです。
all混乱を解決する必要がある関連する質問への回答は次のとおりです: パスワードを安全にハッシュする方法
編集:
他の回答者が言ったように、パスワードをソルトすることでブルートフォースを防ぐことはできません。このタスクには他の手法も存在します。通常、これはある種のスロットルであり、試行回数を制限します。 UXの観点からは、次の試行が失敗するたびに段階的に調整するのが最適です。
上記のリンクされた回答からの抜粋は次のとおりです。
パスワードを検証できるサーバーの全体的なコンテンツは、実際にパスワードを検証するのに十分であるため、サーバーの読み取り専用のスナップショットを取得した攻撃者は、オフライン辞書攻撃を行うことができます。一致するものが見つかるまで、潜在的なパスワードを試します。これは避けられません。したがって、そのような攻撃を可能な限り困難にしたいと考えています。ツールは次のとおりです。
<...>
ソルト:防御側に対する攻撃側の利点の1つは並列処理です。攻撃者は通常、ハッシュされたパスワードのリスト全体を取得し、できるだけ多くのパスワードを解読することに関心があります。彼はいくつかを並行して攻撃しようとするかもしれません。たとえば、攻撃者は1つの潜在的なパスワードを検討し、それをハッシュして、その値を100個のハッシュされたパスワードと比較する可能性があります。これは、攻撃者がいくつかの攻撃されたパスワードに対してハッシュのコストを共有することを意味します。同様の最適化は、Rainbowテーブルを含む事前計算されたテーブルです。これは相変わらず、座標の時空間変化を伴います。
並列処理を使用するすべての攻撃の共通の特徴は、まったく同じハッシュ関数で処理された複数のパスワードに対して機能することです。ソルトとは、1つのハッシュ関数ではなく、多数の異なるハッシュ関数を使用することです。理想的には、パスワードハッシュの各インスタンスは独自のハッシュ関数を使用する必要があります。ソルトは、ハッシュ関数の大きなファミリから特定のハッシュ関数を選択する方法です。適切に適用されたソルトは、並列攻撃(レインボーテーブルを含む)を完全に阻止します。
簡単に言うと、レインボーテーブルとソルトの関係は、ソルト値ごとに1つのレインボーテーブルがあるということです。レインボーテーブルを計算することは、単一のソルトを使用する、またはまったく使用しないパスワードを総当たりすることと同じです。時間はかかりますが、通常はかなりの時間がかかります。データベース内のすべてのパスワードが異なるソルト値を使用してソルト化されている場合、データベースが盗まれた場合の攻撃者の仕事は、簡単に言えば、桁違いに増加しています。パスワードごとに、事前に計算された特定のRainbowテーブルが存在する必要があります。
それは保護の問題ではありませんそれ自体、それは攻撃者の人生をより困難にする問題です。
最初のポイントは簡単に答えられます。それを妨げるものは何もありません。塩はとにかくブルートフォース攻撃を回避する手段ではありません。
あなたの2番目と3番目のポイントはより関連しています。ソルトは、レインボーテーブルを1つ用意してすべてを支配するのを避けるためにここにあります。つまり、ユーザーごとにソルトが異なります。つまり、複数のユーザーを攻撃する場合は、この特定のソルトのレインボーテーブルを計算する必要があります。特にソルト値が十分に大きい場合、レインボーテーブルの計算は無料ではありません。時間とお金がかかります。
もちろん、ソルトはすべてのパスワードの問題を解決するソリューションではありません。ただし、セキュリティはトレードオフに関するものです。ユーザー認証を確認する簡単な方法がありますが、攻撃者にとって困難(時間と費用がかかる)になります。セキュリティについて知っておくべきことの1つは、「正しい手段があれば、何でも壊すことができる」ということです。すべての攻撃者が必要な手段すべてにアクセスできるわけではありません。