web-dev-qa-db-ja.com

ユーザーパスワードソルトの最適な長さは?

すべての salt は、ユーザーのパスワードをソルトおよびハッシュするときに明らかに役立ちます。塩の長さに関するベストプラクティスはありますか?ユーザーテーブルにソルトを格納するので、ストレージサイズとセキュリティの最適なトレードオフが必要です。ランダムな10文字のソルトで十分ですか?または、もっと長いものが必要ですか?

124
David

これらの答えのほとんどは少し見当違いであり、ソルトと暗号化キーの混乱を示しています。 saltを含める目的は、各ユーザーのパスワードのハッシュに使用される関数を変更して、保存されている各パスワードハッシュを個別に攻撃する必要があるようにすることです。唯一のセキュリティ要件は、ユーザーごとに一意であるということです。予測できない、または推測が難しいという利点はありません。

ソルトは、各ユーザーのソルトが一意になるように十分な長さである必要があります。ランダムな64ビットのソルトは、登録ユーザーが10億人であっても繰り返されることはほとんどないため、これで問題ありません。単独で繰り返されるソルトはセキュリティ上の比較的小さな懸念事項であり、攻撃者は一度に2つのアカウントを検索できますが、全体としてはデータベース全体の検索速度はあまり向上しません。ほとんどの場合、32ビットのソルトでも受け入れられますが、最悪の場合、攻撃者の検索は約58%速くなります。 64ビットを超えてソルトを増やすコストは高くありませんが、そうするセキュリティ上の理由はありません。

ユーザーごとのソルトの上にサイト全体のソルトを使用することにはいくつかの利点があります。これにより、他のサイトに保存されているパスワードハッシュとの衝突を防ぎ、32ビットの一般的なレインボーテーブルの使用を防ぐことができます塩は虹のテーブルを非実用的な攻撃にするのに十分です。

単純な開発者でさえ、常にこれを見過ごしています。一意のユーザーIDまたはログイン名を持っている場合、それらは塩として完璧に機能します。これを行う場合は、サイト全体にソルトを追加して、同じアイデアを持つ別のシステムのユーザーと重複しないようにする必要があります。

65
SecurityJoe

現在、 受け入れられている標準 ハッシュパスワードでは、すべてのパスワードに新しい16文字のソルトを作成し、ソルトをパスワードハッシュと共に保存します。

もちろん、本当にランダムなソルトを作成するための適切な暗号化の注意が必要です。

34
David Schmitt

編集:私の下の答えは尋ねられたように質問に答えますが、「本当の」答えは: bcryptscrypt 、または Argon2 を使用するだけです。このような質問をしている場合、ほぼ確実に低レベルのツールを使用していることになります。

正直なところ、ソルトをハッシュされたパスワードと正確に同じ長さにしない正当な理由はありません。 SHA-256を使用している場合、256ビットのハッシュがあります。 256ビットのソルトを使用しない理由はありません。

256ビットを超えても、数学的にはセキュリティの改善は得られません。しかし、ソルトを短くすると、レインボーテーブルがソルトの長さに追いついてしまう場合があります(特にソルトが短い場合)。

24
Stephen Touset

ウィキペディア

Linux、BSD Unix、およびSolarisで使用されるSHA2-cryptおよびbcryptメソッドには、128ビットのソルトがあります。これらの大きなソルト値は、近い将来、これらのシステムに対してほとんどすべての長さのパスワードに対する事前計算攻撃を実行不可能にします。

128ビット(16バイト)のソルトで十分です。 128 / 4 = 32 16進数のシーケンスとして表すことができます。

7

1つの答えは、使用するハッシュがセキュリティの観点から提供する値をソルトのサイズとして使用することです。

例えば。 SHA-512が提供するセキュリティは256ビットなので、SHA-512を使用する場合は256ビットソルトを使用します。

2