web-dev-qa-db-ja.com

パスワードの長さの制限を回避するためにbcryptを適用する前にパスワードを事前にハッシュする

パスワードの長さを不必要に制限しないことをお勧めします。そのため、適切に長いパスフレーズ(おそらく6/7のダイスワードでは35〜45文字)を使用できます。 (例: パスワードの最大長はありますか? 長いパスワードを設定するユーザーの機能を制限せずにDoSから保護するために、最大1Kが推奨されます。)

bcryptも一般的に推奨されます(例: パスワードの保存にセキュリティの専門家がbcryptを推奨していますか?http://chargen.matasano.com/chargen/2007/9/7/enough- with-the-Rainbow-tables-what-you-need-to-know-about-s.html

また、salt(ランダムで、パスワードハッシュとともに保存される)を使用することをお勧めします。32ビット(4文字)がしばしば推奨されると思います。 (ソルトサイズの根拠は「組み合わせの数がユーザーレコードの数よりもはるかに多く、Rainbowテーブルを実行不可能に大きくするのに十分であること」です-2番目の部分には16ビットで十分ですが、最初は十分です。)

ただし、AIUI bcryptのハッシュは55バイトのみです。ソルトには4文字、パスワードには51が残ります。

私はbcrypt(left(password、51))だけではなく、最後の文字を無視するべきではないと思います。

ユーザーのパスワードを50文字に制限する必要がありますか(ほぼ全員に十分ですが、間違いなく十分ではありません)?

代わりにbcrypt(sha256(salt + password))のようなものを使用し、最大1K文字を許可する必要がありますか?それとも、sha256(またはsha512?)ステップを追加すると、全体的なセキュリティがどういうわけか低下しますか?

ScryptまたはPBKDF2にも同様の長さ制限がありますか?

(最後の質問は本当に興味があるだけです-スペース硬度/ FPGA耐性、およびscryptの相対的な新しさ、およびPBKDF2と比較したbcryptのGPGPU耐性は、どのハッシュを決定する際のはるかに重要な考慮事項であることを理解しています使用する。)

65
Misha

安全なハッシュ関数を使用してパスワードを前処理することは安全です。 bcrypt(SHA-256(password))が壊れている場合、パスワードが推測されたか、SHA-256のセキュリティ特性の一部が偽であることが証明されたことがわかります。そのレベルで塩をいじる必要はありません。パスワードをハッシュし、その結果に対してbcryptを使用します(bcryptマンデートとして、saltを使用)。 SHA-256は安全なハッシュ関数と見なされます。

ソルトのポイントは一意であることです。可能な限り一意であるため、2つのハッシュされたパスワードが同じソルト値を使用することはありません。そのため、32ビットは少し低いです。より長い塩を使用する必要があります。 nビットのソルトがある場合、約2を超えるとすぐに衝突(同じソルトを使用する2つのハッシュされたパスワード)が発生します。n/2ハッシュ化されたパスワード-n = 32で約65000ですが、高すぎる値ではありません。 64ビット以上のソルトを使用することをお勧めします(128ビットを使用すると、心配する必要がなくなります)。

39
Thomas Pornin

Bcryptは128ビットのソルトと55文字(最大)のパスワードを使用します。他のソルト値を追加する必要はありません。 bcryptはそれを処理します。

Bcryptの設計者は、ハッシュには128ビットの出力があるため、パスワードの55文字の制限は問題ではないと感じました。パスワードが55文字を超える場合、設計者は、128ビットを超えるエントロピーをすでに提供していると想定しているため、これは問題になりません。逆に、NISTガイドラインでは、これを77ビットのエントロピーとしてのみカウントします。 NISTガイドラインは、パスフレーズはランダムなパスワードよりも文字あたりのエントロピーが少ないという事実と、ユーザーがより長いパスワードにパスフレーズを使用するという前提に基づいています。完全な128ビットのエントロピーを確実に取得するために、より長いパスワードを許可し、SHA-256またはSHA-384を使用してそれらをハッシュして、許容できる長さに圧縮することができます。また、長さに制限のないscryptまたはPBKDF2を使用して、物事を単純化することもできます。 Scryptは、計算に時間がかかるだけでなく、「メモリを節約する」ように設計されています。それが私のアルゴリズムの選択になります。

14