PBKDF2(特にSHA-256を使用)を使用する場合に、反復回数が「十分」であるかどうかを判断する際に、アドバイスや参照ポイントがあるかどうか知りたいです。確かに、「十分に良い」は主観的で定義が困難であり、アプリケーションとリスクプロファイルによって異なります。また、今日「十分に良い」とは、明日は「十分に良い」とは言えない...
しかし、問題は残っています、業界は現在「十分に良い」とは何だと思いますか?比較できる参照ポイントは何ですか?
私が見つけたいくつかの参照:
あなたのアプリケーションにとって何回の反復が「十分」であったかをどのように決定したかについての追加の参照やフィードバックがあれば幸いです。
追加の背景として、私はPBKDF2-SHA256を、セキュリティ意識の高いWebサイトのストレージ用にユーザーパスワードをハッシュするために使用される方法として検討しています。私が計画しているPBKDF2ソルトは、ユーザーごとのランダムソルト(ユーザーレコードごとにクリアテキストで保存)とグローバルソルトでXORしたものです。目的は、ブルートフォースパスワードのコストを増加させ、同一のパスワードを持つユーザーのペアを明らかにしないようにすることです。
参照:
アプリケーションでは、パフォーマンス面で許容できる最大ラウンド数を使用する必要があります。ラウンド数はスローダウン要因であり、通常の使用状況では、そのようなスローダウンによる影響はごくわずかです(ユーザーには表示されず、追加のCPUコストはより大きなサーバーの購入を意味しません)。など)。これは、運用状況に大きく依存します。関係するマシン、1秒あたりのユーザー認証の数などです。そのため、万能な応答はありません。
全体像はこうなる:
あなたの目標は、1つのパスワードを解読するための平均コストが攻撃者の忍耐力を超えるようにすることです。これにより、攻撃者は試みずに、別のより簡単なターゲットに集中し続けることができます。上記の詳細な表記では、これは次のことを意味します。
v・2n-1 > f・p
pは制御不能です。ユーザーパスワードで保護されたデータとシステムのvalueに関して見積もることができます。 pが1か月であるとしましょう(1か月以上かかる場合、攻撃者はわざわざ試みません)。より大きなサーバーを購入することで、fを小さくすることができます。一方、攻撃者は、より大きなマシンを購入することにより、fをより大きくしようとします。さらに深刻なのは、パスワードの解読が 恥ずかしいほど並列 タスクであるため、攻撃者は 一般的なプログラミングをサポートするGP ;を使用することで大幅なブーストを得られることです。したがって、典型的なfは、まだ数百程度の範囲です。
nは、パスワードの品質に関係します。これは、厳密なパスワード選択ポリシーによって何らかの形で影響を与えることができますが、現実的には取得に苦労します。 nの値、たとえば32ビットを超えています。より強力なパスワードを適用しようとすると、ユーザーは他の場所のパスワードを再利用したり、付箋にパスワードを書き込んだりするなどの回避策によって、積極的にあなたと戦うようになります。
したがって、残りのパラメーターはvです。 f = 200(ダースの優れたGPUを持つ攻撃者)、1か月の忍耐力、およびn = 32、vは少なくとも241ミリ秒である必要があります(注:ここでは「8ミリ秒」を最初に記述しましたが、これは間違っています-これは、1か月ではなく1日の忍耐力の数値です)。したがって、PBKDF2のラウンド数を設定して、単一のパスワードでの計算にサーバーで少なくともその時間がかかるようにする必要があります。 1つのコアで1秒あたり4つのパスワードを検証できるため、CPUへの影響はごくわずかです(*)。実際には、それよりも多くのラウンドを使用する方が安全です。実際のところ、平均的なユーザーパスワードから32ビット相当のエントロピーを取得するのは少し楽観的だからです。一方、1つのパスワードを解読するタスクに1か月間数十台のPCを費やす攻撃はそれほど多くないため、1日の「攻撃者の忍耐力」がより現実的であり、8ミリ秒のパスワード検証コストにつながる可能性があります。
したがって、いくつかのベンチマークを行う必要があります。また、PBKDF2/SHA-256の実装が高速である限り、上記は機能します。たとえば、完全にC#/ Javaベースの実装を使用している場合、CPU集中型のタスクに対して(Cまたはアセンブリと比較して)典型的な2〜3のスローダウンファクターが得られます。上記の表記では、これはfに2または3を掛けることに相当します。比較ベースラインとして、2.4 GHz Core2 CPUは約230万を実行できます1秒あたりの基本的なSHA-256計算(シングルコアの場合)なので、これは、CPUで「8ミリ秒」の目標を達成するために約20000ラウンドを意味します。
(*)パスワード検証のコストを高くすると、サーバーが Denial-of-Service attack に対して脆弱になるので注意してください。 1秒あたりのリクエスト数が多すぎるクライアントIPアドレスを一時的にブラックリストに登録するなど、いくつかの基本的な対策を適用する必要があります。とにかく、オンライン辞書攻撃を阻止するためにそれをする必要があります。
コマンドラインでopenssl speed
を実行して、メッセージダイジェスト機能の速度を把握します。クアッドコア2.2 GHzのSandy Bridgeで、1日あたり約160万回のsha256ハッシュまたは約145 Billion推測を計算できます。誰かが英語の辞書にあるパスワードを持ち、sha256を1ラウンド使用した場合、リストを反復してハッシュを壊すよりも、Wordのリストをディスクからロードする方が時間がかかります。数十万ラウンドでPKBDF2-SHA256を実行した場合、壊れるまでに数分かかります。強力なパスワードポリシーを適用すると役立ちますたくさん。
本当の答え:あなたはどのくらいの時間を燃やす必要がありますか?
Thomasの回答は、有用なベースラインモデルとデータを提供します。しかし、彼が主張する目標は私には意味がありません。典型的な攻撃者は、実際にサイトをハッキングしてハッシュのデータベースを取得するまで、反復回数を知りません。それを行っても、繰り返し回数が多いからといって先に進むことはありません。彼らは可能な限り多くのクラックを試み、おそらく他の人が何年にもわたってクラックを試み続け、ますます強力なハードウェアが搭載されるように、ハッシュを公表します。したがって、「p」と「f」はどちらも、ハッキング後もずっと長くなり続けます。
また、実際のユーザーパスワードは、32ビットのエントロピーのような複雑さの尺度では十分にモデル化されていません。記事 再利用可能なセキュリティ:パスワードセキュリティメトリックに関する新しいペーパー はこの点で役立ち、私たちが長い間知っていたことを文書化しています。多くのユーザーが推測しやすいパスワードを選択し、長いテールがあります。これはまた、攻撃者が十分に頑張った場合、常にいくつかを見つけることを意味します。
より可能性の高い目標は、ユーザーのパスワードをクラックされないようにできる限り多くのユーザーを保護することだと思います。例えば。 [〜#〜] pdf [〜#〜] の表4.2.1は、攻撃キャンペーン中に攻撃者をハッシュあたり平均100万回の試行から500,000回の試行に制限できた場合を示しています。 、ユーザーの5%のパスワードを保護する可能性があります(8文字以上のパスワードよりも7文字のパスワードが混在していると想定して、クラックの割合を35%から30%に減らします)。もちろん、カーブの正確な形状とカーブ上の場所は大きく異なります。
ですから、実際のユーザーが通常のログインを行うのを遅らせない限り、予算を組むことができる最大の反復回数を求めます。また、コンピューティング容量が長年にわたって増加するにつれて、値を増やす必要があります。
現世代の8つのGPUを搭載した最新のマシンは、1秒あたり約90億SHA-256ハッシュ、または1日あたり約777兆ハッシュを計算し、これらのGPUはルールベースの辞書攻撃を実行できます。
これを非常に長いコメントとして捉えてください。個人用ラップトップ(Thinkpad T460p、 Intel i7-6700HQ )での実行速度が気になりました。ソルトされたパスワードを解読するための特別なデバイスがあることは知っていますが、Webサービスを使用している場合、そのための特別なハードウェアがない可能性があります。
デフォルトの werkzeug.security.generate_password_hash
現在(2019-06-01)はpbkdf2:sha256:150000
。
ご覧のとおり、実行時間はラウンド/反復の数に比例して増加します。つまり、私のマシンではデフォルトで平均約281msかかります。
sha512, 1 iteration : min: 67.1μs, mean: 72.2μs, max: 310.9μs
sha512, 15000 iteration: min: 38462.8μs, mean: 40291.2μs, max: 44842.4μs
sha256, 15000 iteration: min: 27167.6μs, mean: 28118.0μs, max: 30826.0μs
sha512, 1000 iteration: min: 2636.7μs, mean: 2694.3μs, max: 3579.0μs
sha256, 1000 iteration: min: 1870.7μs, mean: 1888.8μs, max: 2477.0μs
md5, 15000 iteration: min: 21126.2μs, mean: 21864.8μs, max: 23799.3μs
sha512, 1 iteration : min: 23.4μs, mean: 26.9μs, max: 40.6μs
sha512, 1000 iteration: min: 2586.7μs, mean: 2761.1μs, max: 3120.6μs
sha256, 1000 iteration: min: 1823.3μs, mean: 1834.6μs, max: 2008.5μs
sha512, 15000 iteration: min: 38507.9μs, mean: 40210.8μs, max: 47430.3μs
sha256, 15000 iteration: min: 27257.1μs, mean: 28454.0μs, max: 31213.5μs
md5, 15000 iteration: min: 21219.9μs, mean: 21842.4μs, max: 24305.0μs