これについては少し異なる見方をします。
私は常に、salted-passwordハッシュと混合したsaltを保存します。
たとえば、ソルトの前半をパスワードのソルトハッシュの前に配置し、ソルトの後半をパスワードのソルトハッシュの後に配置します。アプリケーションはこの設計を認識しているため、このデータをフェッチして、saltおよびsalted-passwordハッシュを取得できます。
このアプローチの私の理論的根拠:
パスワード/ハッシュデータが危険にさらされて攻撃者の手に渡った場合、攻撃者はデータを見てもソルトが何であるかを知ることができません。この方法では、攻撃者はハッシュを照合するパスワードを取得するためにブルートフォース攻撃を実際に実行することはできません。なぜなら、攻撃者はハッシュを知ることができず、データのどの部分がソルトの一部であるかを知る方法がないためです。ソルトパスワードハッシュの一部(アプリケーションの認証ロジックを知らない場合)
saltされたパスワードのハッシュがそのまま保存されている場合、ブルートフォース攻撃を実行して、saltされてハッシュされたときにsalted-passwordのハッシュと同じデータを生成するパスワードを取得できます。
ただし、たとえば、ソルトパスワードハッシュがそのまま保存されていても、先頭にランダムな1バイトが付加されていたとしても、この最初のバイトが破棄されることを攻撃者が認識していない限り、これにより難易度も高くなります。攻撃の。アプリケーションは、ユーザーの認証に使用されると、データの最初のバイトを破棄することを知っています。
これの結論
1)認証アプリケーションが使用するデータを正確な形式で保存しないでください。
2)可能であれば、セキュリティを強化するために認証ロジックを秘密にしてください。
さらに一歩進んでください。
アプリケーションの認証ロジックを秘密にしておくことができない場合、多くの人がデータがデータベースにどのように格納されるかを知っています。また、ソルトパスワードハッシュの前にソルトの一部を追加し、残りのソルトにソルトを付加して、ソルトパスワードハッシュをソルトと組み合わせて保存することにしたとします。
ランダムなソルトを生成するときに、ソルトされたパスワードのハッシュの前/後に保存するソルトの割合をランダムに決定することもできます。
たとえば、512バイトのランダムなソルトを生成します。saltをパスワードに追加し、salted-passwordのSHA-512ハッシュを取得します。また、ランダムな整数200を生成します。次に、saltの最初の200バイトを格納し、その後にsalted-passwordハッシュを格納し、その後にソルトの残りを格納します。
ユーザーのパスワード入力を認証するとき、アプリケーションは文字列を渡し、データの最初の1バイトがソルトの最初の1バイトであり、その後にソルトハッシュが続くと想定します。このパスは失敗します。アプリケーションは、データの最初の2バイトをソルトの最初の2バイトとして使用し続け、最初の200バイトをソルトの最初の200バイトとして使用した後、肯定的な結果が見つかるまで繰り返します。パスワードが間違っている場合、アプリケーションは何も見つからなくなるまですべての順列を試し続けます。
このアプローチの長所:
セキュリティの向上-認証ロジックがわかっている場合でも、正確なロジックはコンパイル時には不明です。正確なロジックの知識があっても、ブルートフォース攻撃を実行することは事実上不可能です。ソルトの長さを長くすると、セキュリティがさらに向上します。
このアプローチの短所:
正確なロジックは実行時に推測されるため、このアプローチは非常にCPUに負荷がかかります。ソルトの長さが長いほど、このアプローチはCPUに負荷がかかります。
不正なパスワードを認証すると、CPUコストが最も高くなります。これは正当な要求に対して逆効果になる可能性がありますが、攻撃者に対するセキュリティが向上します。
このアプローチはさまざまな方法で実装でき、可変幅のソルトやソルト付きパスワードのハッシュを使用することでさらに安全にすることができます。