どれ塩塩漬けし、ユーザーのパスワードをハッシュするとき、すべてのは明らかに役立ちます。塩分の長さに関するベストプラクティスはありますか?私は自分のユーザーテーブルにソルトを格納するので、ストレージサイズとセキュリティの間の最良のトレードオフが必要です。ランダムな10文字のソルトで十分ですか?それとももっと長いものが必要ですか?
どれ塩塩漬けし、ユーザーのパスワードをハッシュするとき、すべてのは明らかに役立ちます。塩分の長さに関するベストプラクティスはありますか?私は自分のユーザーテーブルにソルトを格納するので、ストレージサイズとセキュリティの間の最良のトレードオフが必要です。ランダムな10文字のソルトで十分ですか?それとももっと長いものが必要ですか?
回答:
これらの回答のほとんどは少し見当違いであり、ソルトと暗号化キーの混乱を示しています。saltを含める目的は、各ユーザーのパスワードのハッシュに使用される関数を変更して、保存されている各パスワードハッシュを個別に攻撃する必要があるようにすることです。唯一のセキュリティ要件は、ユーザーごとに一意であることであり、それらが予測できない、または推測するのが難しいという利点はありません。
ソルトは、各ユーザーのソルトが一意になるように十分な長さである必要があります。ランダムな64ビットソルトは、10億人の登録ユーザーがいても繰り返される可能性が非常に低いため、これで問題ありません。単一で繰り返されるソルトは比較的軽微なセキュリティ上の問題であり、攻撃者が2つのアカウントを一度に検索することを可能にしますが、全体としてはデータベース全体の検索速度はそれほど速くありません。32ビットのソルトでもほとんどの目的で許容されますが、最悪の場合、攻撃者の検索が約58%高速化します。64ビットを超えてソルトを増やすコストは高くありませんが、そうすることにはセキュリティ上の理由はありません。
ユーザーごとのソルトに加えてサイト全体のソルトを使用することにもいくつかの利点があります。これにより、他のサイトに保存されているパスワードハッシュとの衝突の可能性を防ぎ、汎用のレインボーテーブルの使用を防ぎます。塩は、レインボーテーブルを非現実的な攻撃にするには十分です。
さらに単純で、開発者は常にこれを見落とします。一意のユーザーIDまたはログイン名を持っている場合、これらはソルトとして完全に機能します。これを行う場合は、サイト全体にソルトを追加して、同じ優れたアイデアを持っている別のシステムのユーザーと重複しないようにする必要があります。
パスワードをハッシュするための現在受け入れられている標準は、すべてのパスワードに対して新しい16文字の長いソルトを作成し、ソルトをパスワードハッシュとともに保存します。
もちろん、本当にランダムなソルトを作成するための適切な暗号化の注意が必要です。
編集:私の下の答えは質問どおりに質問に答えますが、「実際の」答えは、単にbcrypt、scrypt、またはArgon2を使用することです。このような質問をしている場合は、ほとんどの場合、ツールのレベルが低すぎます。
正直なところ、ソルトがハッシュされたパスワードと正確に同じ長さにならないようにする正当な理由はありません。SHA-256を使用している場合は、256ビットのハッシュがあります。256ビットソルトを使用しない理由はありません。
数学的には、256ビットを超えてもセキュリティは向上しません。しかし、より短いソルトを使用すると、レインボーテーブルがソルトの長さに追いつくという状況になる可能性があります(特に、ソルトが短い場合)。
Linux、BSD Unix、およびSolarisで使用されるSHA2-cryptおよびbcryptメソッドには、128ビットのソルトがあります。これらのより大きなソルト値は、予見可能な将来において、これらのシステムに対してほぼすべての長さのパスワードに対する事前計算攻撃を実行不可能にします。
128ビット(16バイト)ソルトで十分です。これを一連の128 / 4 = 32
16進数として表すことができます。
1つの答えは、セキュリティの観点から、使用するハッシュが提供する値をソルトのサイズとして使用することです。
たとえば、SHA-512が提供するセキュリティは256ビットであるため、SHA-512を使用する場合は256ビットソルトを使用します。