塩漬けの仕組みがよくわかりません。 Wikipediaの記事 を読みましたが、システムがソルトハッシュを認証する方法をまだ理解できません。
ユーザーがパスワードを選択するとします。ランダムにソルト処理され、ハッシュ化されます。これで、そのユーザーが再度ログインするときに、パスワードが再度ハッシュされ、前回保存されたソルトおよびハッシュされたパスワードと比較されます。ハッシュは一致しませんか?
つまり、彼らは何らかの方法で一致することを推測します。しかし、どうやって?
パスワードを最初にハッシュするとき(ユーザーが登録するとき)は、saltを使用し、saltと結果のハッシュの両方をデータベースに格納します。
2回目(彼らが再度ログインしようとしたとき)は、ユーザー名を使用してソルトとハッシュをデータベースから引き出します。 saltを使用してパスワード入力をハッシュし、2つのハッシュを比較します。
「誰かが私のデータベースにアクセスする場合、彼らはすべての塩を持っている-これは大きな問題ではありませんか?」と疑問に思うかもしれません。彼らがソルトを持っているという事実は問題ではありません。ソルトの目的は何か「秘密」を追加することではないので、2人のユーザーが同じパスワードを持っている場合に確認することです彼らは異なるハッシュを持っています =ハッシュが異なる塩で作成されたため。
ソルトを使用しなかった場合、またはすべてのユーザーにまったく同じソルトを使用した場合(残念ながら珍しい間違いではありません)、多くの重複したハッシュが発生します(同じパスワードを使用する人がいるため、これらの同一のパスワードはすべてが同じハッシュを持っています)。誰かがデータベースにアクセスした場合、彼らは最も頻繁に出現するハッシュを探し、それらのハッシュのクラックに集中できます。そして、各ハッシュをクラックして、複数のアカウントにアクセスできます。各ハッシュを異なる方法でソルト処理することで、ハッシュが重複しない可能性が非常に高くなります。異なるソルトは、重複したパスワードでも異なるハッシュを持つことを意味します。解読するハッシュごとに、1つのアカウントにアクセスできます-それ以上はアクセスできません。それが塩の目的です。
ソルトはハッシュと一緒に、たとえば別のデータベースフィールドに格納されるか、ハッシュの最後にタグ付けされるか、ユーザー名がソルトとして使用されます。
目的は、2人のユーザーが同じパスワードを持っている場合でも、そのソルトが異なり、そのため、ハッシュが同じにならないようにすることです。
これは、誰かがデータベースを盗むことができた場合に役立ちます。ハッシュとソルトの各組み合わせを個別にクラックする必要があります。したがって、同じパスワードを共有する2人のユーザーの場合、攻撃者は、両方を解読するまで同じであることを知りません。
また、saltがなければ、攻撃者が一般的なパスワードのハッシュを生成して、盗んだデータベースと照合することもできます。ソルティングはこれらの生成されたレインボーテーブルを役に立たなくします。
これまでのところ素晴らしい回答ですが、あなたが参照した記事からはあまり明確ではないので、私も言及する必要があると思います。ハッシュ関数は、パスワードとともに連結されたソルトに対して実行され、ソルトは、関数から得られたハッシュで再度連結され、その文字列は、/ etc/shadowのようなパスワードデータベースに格納されます。
この例は、ユーザーがUnixシステムでパスワードを選択したときに何が起こるか、/ etc/shadowにどのように保存されるか、そしてユーザーがログインするときにパスワードがどのようにチェックされるかを示しています。変数名の代わりに実際の例を使用しますまたはfoobarのような文字列。また、これを少し簡単にするために、pamのようなものは無視します。
/ etc/shadowの完全なエントリは次のようになります。
munroe:$6$BohpaS.aul0Qua/t$IVUen1dSKZ634jM.KLQ1Am/WPh..DSO2MYI53qffac2IFzESKwIufyVjzQGlxNenOXGehMTCdSoL9DLPe6Zfm1:15196:0:99999:7:::
$ 6 $の部分は、SHA-512ハッシュされたことを示しています。 2番目と3番目の「$」文字の間の部分には、使用されたソルトが格納されます。シャドウファイルのこのフィールドは、暗号化フィールドと呼ばれます。暗号化されていないハッシュ化されているため、一部の人々はその名前を好まない。暗号化されているとは、復号化できることを意味しますが、復号化はできません。ただし、暗号化されたパスワードフィールドと呼びます。
うまくいけば、これは、ハッシュアルゴリズムが一方向のアルゴリズムである必要がある理由と、ソルトがどのように使用されるかを示しています。
シャドウファイルの理由は、/ etc/passwordファイルがUNIXシステムで誰でも読み取り可能である必要があるためです。昔、彼らは暗号化されたパスワード(および非常に昔には平文のパスワードも)を/ etc/passwordファイルの2番目のフィールドに保管していた。彼らはそれをシャドウファイルに移動し、そのファイルへのルートアクセスのみを与え、認証メカニズムはあなたを認証するためにルート権限を必要とします。
ええと、思ったよりずっと長くなってしまいました。
ユーザーは常に実際のパスワードをサーバーに送信し、サーバーはソルト値とハッシュ値を保存します。ソルトの要点は、DBが危険にさらされている場合に、攻撃者がすべてのパスワードを一度に総当たりすることはできないことを確認することです。また、再利用されたパスワードの識別を防ぎます。
一致するまですべてのパスワードを試す必要があるだけなので、ソルトを知っていても攻撃者の作業を減らすことはないので、ソルトが公の知識になってもかまいません。ハッシュはサーバー上で行われるため、クライアントは実際にパスワードを知らなくても、DBに表示されるハッシュを簡単に返すことができません。