12

I've read through many of the questions on SO about this, but many answers contradict each other or I don't understand.

You should always store a password as a hash, never as plain text. But should you store the salt (unique for each user) next to the hashed password+salt in the database. This doesn't seem very clever to me as couldn't someone gain access to the database, look for says the account called Admin or whatever and then work out the password from that?

4

6 に答える 6

26

多くの人が、レインボーテーブルが何をするのか、なぜこれが彼らを止めるのかを説明せずに「レインボーテーブルを止める」と言っています。

レインボーテーブルは、多数のハッシュを事前に計算し、それらを単純に必要とされるよりも少ないメモリに格納するための巧妙な方法であり、それらを使用してハッシュを非常にすばやく逆にすることができます。hash = md5(password)およびなどのベア関数のテーブルhash = sha1(password)は一般的です。

ただし、これらは、として記述できる任意のハッシュ関数に対して生成できますoutput = f(input)。たとえば、すべてのユーザーパスワードにサイト全体のソルトを使用する場合hash = md5(salt+password)、関数f、を作成できますf(password) = md5(salt+password)。したがって、この関数のレインボーテーブルを生成できます。これには長い時間がかかりますが、データベース内のすべてのパスワードを非常に迅速に解読できます。

パスワードごとにソルトが異なる場合、データベース内のすべてのパスワードを解読するレインボーテーブルを生成することはできません。すべてのユーザーに対して新しいものを生成することもできますが、それは無意味です-素朴なブルートフォースは遅くはありません。したがって、ユーザーごとに個別のソルトを用意することで、レインボーテーブルの攻撃を防ぐことができます。

これを実現するには、いくつかの方法があります。人気のある方法は次のとおりです。

  • データベースに他の詳細と一緒に保存された、ユーザーごとの個別のソルト:hash = hashfunction(salt + password)
  • グローバルソルトとユーザーごとの固有の値:hash = hashfunction(salt + password + user_id)たとえば
  • グローバルソルトとユーザーごとのソルト:hash = hashfunction(global_salt + user_salt + password)

グローバルソルトを使用すると、データベースの外部(コードなど)に保存され、データベースが侵害された場合に攻撃者がアクセスできない可能性があるため、パスワードの解読が少し複雑になる可能性があります。暗号的にはそれほど多くはないと思いますが、実際には速度が低下する可能性があります。

最後に、実際の質問に答えるには:

ソルトをユーザーデータと一緒に保存しても、ハッシュが弱くなることはありません。ハッシュ関数は一方向です。無塩のパスワードであっても、パスワードのハッシュを考えると、そのパスワードを見つけるのは非常に困難です。ソルトの背後にある動機は、個々のハッシュをより安全にすることではなく、複数のハッシュのコレクションをより安全にすることです。無塩ハッシュのコレクションには、いくつかの攻撃ベクトルがあります。

  • レインボーテーブル
  • 123一般的なパスワード( 、、 )をハッシュし、データベースにパスワードが存在するかどうかを確認してから、それらのアカウントを侵害しpasswordますgod
  • データベースで同一のハッシュを探します。これは、同一のパスワードを意味します(おそらく)
于 2010-04-20T17:10:50.573 に答える
6

ソルトは、攻撃者がデータベースに保存されているハッシュと一致するパスワードを見つけるために費やさなければならない時間を増やすために使用されます。通常、これを実現するために、レインボー テーブル ( http://en.wikipedia.org/wiki/Rainbow_tableを参照) などのルックアップ テーブルが使用されます。

時間がかかるのはルックアップ自体ではなく、レインボー テーブルを計算する時間です。ソルトを追加すると、たとえ攻撃者がデータベースを侵害することを知っていたとしても、攻撃者は新しいレインボー テーブルを再計算することを余儀なくされます。

于 2010-04-06T07:17:07.887 に答える
3

ソルトは、既存のレインボーテーブルを妨害するためのものです。ソルトを知ることはセキュリティ上の脅威ではありません。ソルトがわかっている場合でも、パスワードを知る必要があります。

于 2010-04-06T07:13:51.560 に答える
2

まず第一に、ソルトの主な目的は、パスワードのブルート フォースを無効にすることです。たとえば、パスワードの迅速な侵害のためにレインボー テーブルを使用するのを防ぎます。

攻撃者がデータベースにアクセスできたとしても、salt から実際のパスワードを割り出すのはそれほど簡単ではありません (特に、コードがなく、パスワードがどのようにハッシュされているかがわからない場合)。ただし、セキュリティを強化するために私がやりたいことは、コードで指定された静的ハッシュでパスワードをハッシュすることです。このように、データベースを危険にさらすだけでは十分ではありません。そのようなメソッドの例 (PHP):

$hashed_password = sha1($user_password . $user_salt . $static_salt);

$user_salt各ユーザーに固有のデータベース内の$static_saltソルトです。コードの設定でどこかに指定されたソルトです。

于 2010-04-06T07:14:48.907 に答える
2

まあまあまあ..非常に多くの議論...非常に多くの情報。非常に多くの質問...すべての質問が回答された後、ここに要約があることがわかりました。

  1. なぜ塩?
  2. ソルトが (パスワード + ソルト) のハッシュと共に保存される理由。

これが私の理解です。

  1. ハッカーは、彼が多大な努力を払って作成したすべての辞書単語のレインボー テーブルを持っています。虹のテーブルを作るたびに、ハッカーは完全に排除されます。簡単に言えば、非常に厳しいです。
  2. ポイント 1 のように、ハッカーに各ユーザーのレインボー テーブルを計算させると、パスワードを知る頃にはハッカーは年を取っています。また、ユーザーが頻繁にパスワードを変更すると、ハッカーの孫でさえ、パスワードを知る頃には年をとっています。
  3. Ok。そのため、ユーザーごとに異なるソルトを使用してください。これにより、ハッカーは個別の攻撃を使用して、すべてのユーザーのパスワードを知ることができます.
  4. さまざまな読者が指摘したように、すべてのユーザーに頭をぶつけるのではなく、優れたハッカーは管理者アカウントに全力を注ぎ、それから彼は終わります:)。したがって、この場合、一歩先に進み、別の方法を使用してハッシュを計算します。塩は正確に保存されているものではないとしましょう。実際のハッシュの半分である可能性があります。残りの半分は、別の方法で別の場所に保管されます (別の方法で計算されます)。これは単なる追加のセキュリティ対策です。そして、現代ではコンピューターの計算能力が向上していることもわかっています。そのため、倫理的な人々は、世界最速のスーパー コンピューターが管理者パスワードをクラックするのに 1 年かかることを知っています (単なる例です)。そのため、管理者パスワードを 3 か月ごとに変更するというポリシーを強制しています。ハッカーが古いパスワードを知る頃には、新しいパスワードが有効になっています。または、データベースが侵害された場合、ハッカーがパスワードを解読するまでに、善良な人々がそれを知るようになります. そして、善良な人たちはそれまでに物事を変更します(アルゴリズムのアップグレード..sha1 sha2、そして現在はsha3を思い出してください).....

わかりました..完全ではありませんが、私が言いたいのは、悪者は多くの時間を費やすということです....しかし、善良な者は、悪者がクラックするために使用するテクノロジーを確実に把握するために一歩先を行っています. ですから、時間をかけてより良い技術を考案してください。

気をつけて ....

于 2012-09-11T05:40:42.843 に答える
1

ソルトを保存しない場合、正しいパスワードが提供されたかどうかをどのように確認しますか?

于 2010-04-06T07:15:27.883 に答える