ユーザーパスワードソルトの最適な長さは何ですか?[閉まっている]


127

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


10
ソルトの長さについての推奨はありませんが、ここに表示される回答には多くの悪い情報があります。ソルトは間違いなく:-ランダムに-シークレットごとに(プログラムイメージまたは構成ファイルに格納されている単一の値ではない)。ソルトは暗号の秘密ではないので、テーブルに保存しても問題はありません。ソルトの唯一の目的は、同じアイテムの異なるインスタンスがハッシュ(または暗号化)されたときに異なる結果が得られるようにすることです。
マイケル・バー、

2
塩が何であるかを知らない人のために:Wikipediaの<a href=" en.wikipedia.org/wiki/Salt_(cryptography)"> Salt(暗号)</a>
David Koelle

1
または、ソルトの長さとハッシュ出力の長さの最適な比率がある場合はどうなりますか?8バイトのソルトはHMAC-SHA-256には十分かもしれませんが、HMAC-SHA-512には不十分かもしれません。
Crend King、2011

1
ハッシュ関数の出力と同じサイズの暗号化ランダムソルトは、「可能なすべてのソルトを試行する」(およびパスワード辞書)攻撃が、「可能なすべてのハッシュ結果を試行する」攻撃と同じくらいの労力を必要とすることを意味します。 。短いソルトは、ブルートフォース攻撃としてソルトディクショナリとパスワードディクショナリを持つことができることを意味します。
Richard Gadsden、2011

-1質問に答えない(認めようとする)ことは確かです。
user359996 2011

回答:


70

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

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

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

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


16
塩が予測不可能であることには利点があります。予測可能なソルトが予測され、ハッシュテーブル攻撃で使用される可能性があります。たとえば、ソルトが単にユーザーIDの場合、十分な長さのプレーンアルファハッシュテーブルには、すべてのパスワードだけでなく、すべてのユーザー名+パスワードの組み合わせが含まれます。
Richard Gadsden、2011

6
最後の段落との関連で、サイト全体のソルトを使用する場合は、サイト全体のソルトである必要があります。アプリケーション全体ではありません。つまり、アプリケーションの新しいインスタンスをインストールするたびに、サイト全体で新しいソルトが生成されます。たとえば、WindowsがすべてのWindows認証データベースで同じソルトを使用している場合、そのソルト用にレインボーテーブルを作成することは価値がありますが、Windowsのすべてのインストールで新しいソルトが生成された場合、生成されません。
Richard Gadsden

5
問題は、塩が推測するのが難しい必要があるということではありません。攻撃者はソルトを推測する必要はありません。ハッシュにアクセスできる人はすでにソルトを持っています。問題は、ソルトが非常に一般的である場合(ユーザー名など)、他のサイトのソルトと同じである可能性があり、その時点で攻撃者は攻撃を実行可能にするために、はるかに小さいレインボーテーブルのセットを必要とします。これが、他のサイトとのこの種の衝突を避けるために、サイトごとのソルトのアイデアが言及されている理由です。
ネイトCK

3
クイックノート:ユーザー名をソルトとして使用している場合、ユーザー名が変更されると問題になることがあります。実際には、(顧客の設計ドキュメントで何が言われているにも関わらず)ユーザーがユーザー名を変更したいと思うことがよくあります。
SilentSteel 14

5
@ NateC-K、あなたが話しているサイトごとの塩のアイデアは、コショウと呼ばれます。
Pacerier 2014

35

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

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


6
文字は少し不明確です。バイトと言うべきです。
CodesInChaos 2014年

10
@CodesInChaos私はあなたがオクテットを意味すると信じています;-)
user2864740

1
こんにちは!ウィキペディアの記事が変更されたようです-多分あなたはen.wikipedia.org/wiki/PBKDF2か何かを参照するべきですか?
ボリストロイホフ2014年


24

編集:私の下の答えは質問どおりに質問に答えますが、「実際の」答えは、単にbcryptscrypt、またはArgon2を使用することです。このような質問をしている場合は、ほとんどの場合、ツールのレベルが低すぎます。

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

数学的には、256ビットを超えてもセキュリティは向上しません。しかし、より短いソルトを使用すると、レインボーテーブルがソルトの長さに追いつくという状況になる可能性があります(特に、ソルトが短い場合)。


10
それはないという大きなA契約; ユーザーは、ミリ秒のハッシュと0.5秒のハッシュの違いにほとんど気付かないでしょう。さらに、パスワードのハッシュでは、ブルートフォース攻撃の速度を落とすのに実際に時間かかるはずです。これを行うためにCPUサイクルを「浪費」していますか?ええ、何でも。とにかく、CPUはほとんどのWebサイトにない場合よりもアイドル時間を費やします。パフォーマンスの問題が発生している場合は、スケールアウトしてください。
Randolpho

14
塩はレインボーテーブルから守ります。256ビットのハッシュを備えた512ビットのソルトは、最終的なパスワードに256ビットのエントロピーのみをもたらします。
スティーブントゥセット、2011年

8
低速ハッシュは機能であり、バグではありません。
outis '15

7
3ビットのハッシュがある場合でも、9999ビットのソルトは、可能なエントロピーの3ビットまでしかハッシュしません。レインボーテーブルは、パスワードごとに3つのソルトを検出するだけで済みます。これは、異なる出力をもたらします。これは定数の乗法因子であり、big-Oから破棄されます。
スティーブントゥセット

2
................................................................. ...................................................特定のシステム。 salt 目的は、事前計算攻撃を阻止して、ハッシュを検索してすぐに平文に戻すことができないようにすることです。9999ビットのソルトを使用すると、パスワードは秘密のままですが、 3ビットのソルトを使用すると、パスワードは世界中に知られます(多くの人がパスワードを再利用することが多いため、パスワードを使用して他のアカウントにログインできます)。「エントロピー」という言葉が原因で、ここの5人が実際にあなたのコメントに賛成していたのは面白いと思います。
Pacerier 2014

7

ウィキペディア

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

128ビット(16バイト)ソルトで十分です。これを一連の128 / 4 = 3216進数として表すことができます。


他の安全なシステムが使用する例は、ベストプラクティスが何であるかの良い例であるように私には思えます。
cjbarth 2013

1
@ mklement0おかげで、私は答えを更新しました。
Andrii Nemchenko

2

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.