21

誰かが塩漬けがどのように機能するかを理解するのを手伝ってくれませんか?

これまでのところ、私は次のことを理解しています。

  1. パスワードを検証する
  2. ランダムな文字列を生成します
  3. パスワードとランダムな文字列をハッシュして連結し、パスワードフィールドに保存します...

ソルトを保存するにはどうすればよいですか、またはユーザーがログインしたときにソルトが何であるかを知るにはどうすればよいですか?独自のフィールドに保存しますか?そうでない場合、アプリケーションはどのようにして塩が何であるかを把握しますか?そして、それを保管するのであれば、それは目的全体を打ち負かしませんか?

4

5 に答える 5

32

ソルトは、ハッシュする前にパスワードと結合されます。パスワードとソルト クリアの値が連結され、結果の文字列がハッシュされます。これにより、2 人のユーザーが同じパスワードを持っていたとしても、異なる結果のハッシュが得られることが保証されます。(また、レインボー テーブルを使用した辞書攻撃として知られる攻撃をより困難にします)。

その後、ソルトはハッシュ結果とともに元の/クリア形式で保存されます。その後、パスワードを確認したい場合は、元のプロセスをもう一度実行します。レコードのソルトとユーザーが提供したパスワードを組み合わせ、結果をハッシュし、ハッシュを比較します。

あなたはおそらくすでにこれを知っています。しかし、覚えておくことが重要です。ソルトは毎回ランダムに生成する必要があります。保護されたハッシュごとに異なる必要があります。多くの場合、RNG はソルトの生成に使用されます。

たとえば、
user-password: "mypassword"
random salt: "abcdefg12345" results
-cleartext: "mypassword:abcdefg12345" (どのように組み合わせるかはあなた次第です。毎回同じ組み合わせ形式を使用する限り) .
結果のクリアテキストをハッシュします: "somestandardlengthhashbasedonalgorithm"

データベースに、使用したハッシュとソルトを保存します。私はそれを2つの方法で見ました:

方法 1:
field1 - salt = "abcdefg12345"
field2 - password_hash = "somestandardlengthhashbasedonalgorithm"

方法 2:
field1 - password_hash = "abcdefg12345:somestandardlengthhashbasedonalgorithm"

どちらの場合でも、ソルトとパスワードのハッシュをデータベースからロードし、比較のためにハッシュをやり直す必要があります

于 2010-08-25T13:36:59.960 に答える
12
salt <- random
hash <- hash(password + salt)
store hash:salt

後で

input password
look up hash:salt
hash(password+salt)
compare with stored hash

とった?

于 2010-08-25T13:17:31.163 に答える
4

Practical Cryptography(NeilsFergusonとBruceSchneier)によると、最大限のセキュリティを確保するには、塩漬けのストレッチハッシュを使用する必要があります。

x[0] := 0
x[i] := h(x[i-1] || p || s)  for i = 1, ..., r
K := x[r]

where
   h is the hash (SHA-1, SHA-256, etc.)
   K is the generated hashed password
   p is the plaintext password
   r is the number of rounds
   s is the randomly generated salt
   || is the concatenation operator

ソルト値は、暗号化されたパスワードとともに保存される乱数です。秘密にしておく必要はありません。

ストレッチとは、ハッシュを複数回実行して、攻撃者がパスワードの多くの順列をテストすることを計算上困難にする行為です。rユーザーのコンピューターで計算に約200〜1000ミリ秒かかるように選択する必要があります。rコンピュータの速度が上がるにつれて、増やす必要があるかもしれません。

于 2010-08-25T13:46:24.947 に答える
4

ソルトをどのように保存するか、ユーザーがログインしたときにソルトが何であるかを知るにはどうすればよいでしょうか? それを独自のフィールドに保管しますか?

はい。

そして、それを保存すると、目的全体が無効になりませんか?

いいえ。ソルトの目的は秘密にすることではなく、世界中のすべてのサイト (ソルトではない) またはサイト内のすべてのユーザー (すべてのユーザーに使用される単一のソルト) でレインボー テーブルを計算するコストを攻撃者が償却するのを防ぐためだけです。 .

于 2010-08-25T13:37:48.313 に答える
1

よく知られているハッシュ アルゴリズムを使用している場合、誰かがそのアルゴリズムを使用して既にハッシュされている可能性のある多くのパスワードのリストを取得し、そのリストの項目を解読したいハッシュされたパスワードと比較する可能性があります (辞書攻撃)。
すべてのパスワードをハッシュする前に「ソルト」すると、ソルトを使用して作成する必要があるため、これらの辞書は役に立ちません。

于 2010-08-25T13:33:24.537 に答える