8

パスライブラリのドキュメントから

一般向けのほとんどのサービスでは、通常、ユーザーがイライラし始めるまでに 250 ミリ秒から 400 ミリ秒のサインイン時間がかかります。

したがって、ログイン試行のためにデータベースへの呼び出しが 1 つあり、それが非ブロッキング呼び出しでMongoDBを使用していると考える場合roundsログイン/登録での最適な値は何でしょうか。( Mongotorを使用し、電子メールを として使用するため、デフォルトでindexedです。クエリは高速です: 0.00299978256226そしてもちろん、 3 つのレコードを持つデータベースでテストされています...)_id

import passlib.hash
import time

hashh = passlib.hash.pbkdf2_sha512
beg1 = time.time()
password = hashh.encrypt("test", salt_size = 32, rounds = 12000)
print time.time()- beg1 # returns 0.142999887466
beg2 = time.time()
hashh.verify("test", password) # returns 0.143000125885
print time.time()- beg2

半分の値を使用する場合:

password = hashh.encrypt("test", salt_size = 32, rounds = 4000) # returns 0.0720000267029
hashh.verify("test", password) # returns 0.0709998607635

Dell XPS 15 i7 2.0 Ghz で Windows 7 64 ビットを使用しています

注意: bcryptをインストールしました。もちろん、デフォルト値として直接使用するのは本当に面倒です ( rounds = 12):

hashh = passlib.hash.bcrypt
beg1 = time.time()
password = hashh.encrypt("test", rounds = 12) # returns 0.406000137329
print time.time()- beg1
beg2 = time.time()
hashh.verify("test", password) # returns 0.40499997139
print time.time()- beg2

半値:

password = hashh.encrypt("test", rounds = 12) # 0.00699996948242 wonderful?
hashh.verify("test", password) # 0.00600004196167

pbkdf2_sha512プロダクションに適したラウンド値を提案してもらえますか?

4

1 に答える 1

22

(passlib開発者はこちら)

pbkdf2_sha512 にかかる時間は、ラウンド パラメータ ( elapsed_time = rounds * native_speed) に比例します。システムのデータを使用すると、約 350 ミリ秒の遅延native_speed = 12000 / .143 = 83916 iterations/secondが必要になります。83916 * .350 = 29575 rounds

かかる時間は、ラウンドパラメーター ( ) に対数的に比例するため、bcrypt の場合は少しトリッキーですelapsed_time = (2 ** rounds) * native_speed。システムのデータを使用すると、約 350 ミリ秒の遅延native_speed = (2 ** 12) / .405 = 10113 iterations/secondが必要になります。ただし、BCrypt は整数ラウンド パラメータのみを受け入れるため、 (~200ms) または(~400ms)log(10113 * .350, 2) = 11.79 roundsを選択する必要があります。rounds=11rounds=12


これらはすべて、passlib の将来のリリースで修正したいと考えています。進行中の作業として、passlib の mercurial リポジトリには現在、単純な小さなスクリプトchoose_rounds.pyが含まれています。このスクリプトは、指定されたターゲット タイムに対して正しいラウンド値を選択します。次のように直接ダウンロードして実行できます (実行には 20 秒ほどかかる場合があります)。

$ python choose_rounds.py -h
usage: python choose_rounds.py <hash_name> [<target_in_milliseconds>]

$ python choose_rounds.py pbkdf2_sha512 350
hash............: pbkdf2_sha512
speed...........: 83916 iterations/second
target time.....: 350 ms
target rounds...: 29575  

$ python choose_rounds.py bcrypt 350
hash............: bcrypt
speed...........: 10113 iterations/second
target time.....: 350 ms
target rounds...: 11 (200ms -- 150ms faster than requested)
target rounds...: 12 (400ms -- 50ms slower than requested)

(編集:安全な最小ラウンドに関する回答を追加...)

免責事項: 安全な最小値を決定することは、驚くほどトリッキーな質問です。定量化するのが難しいパラメーターが数多くあり、実際のデータはほとんどなく、厳密には役に立たない理論もあります。十分な権威がないので、私は自分でこのトピックを調査してきました。すぐに計算できるように、生データを短い式 (以下) にまとめました。これは通常、私が使用するものです。その後ろには数ページの仮定と大まかな見積もりがあり、正確な答えよりもフェルミ推定に近いことに注意してください:|

GPU を使用して PBKDF2-HMAC-SHA512 を攻撃するための私の経験則 (2012 年半ば) は次のとおりです。

 days * dollars = 2**(n-31) * rounds
  • days攻撃者が 50/50 の確率でパスワードを推測するまでの日数です。
  • dollarsは、攻撃者のハードウェア予算 (米ドル単位) です。
  • nユーザーのパスワードのエントロピーの平均量 (ビット単位) です。

スクリプトキディの質問に答えるには:平均的なパスワードのエントロピーが 32 ビットで、攻撃者が優れた GPU を備えた 2,000 ドルのシステムを所有している場合、30,000 ラウンドで2**(32-31)*30000/200050/50 の確率でクラックされるには 30 日 ( )が必要です。与えられたハッシュ。満足できるラウンド/日のトレードオフに到達するまで、値を試してみることをお勧めします。

注意事項:

  • 辞書攻撃の成功率は直線的ではなく、より「ロングテール」の状況であるため、50/50 マークは半減期と考えてください。

  • 31特定の技術レベルを使用して特定のアルゴリズムを攻撃するコストの見積もりをエンコードするため、これが重要な要素です。実際の値 は2**-31、攻撃者にかかる「1 ラウンドあたりのドル日数」を測定します。比較のために、 ASICを使用して PBKDF2-HMAC-SHA512 を攻撃すると、より近い要因があり46ます。数値が大きいほど、攻撃者の負担が大きくなり、ラウンドごとのセキュリティが低下しますが、スクリプト キディには通常、そのような予算はありません。 )

于 2012-11-26T20:03:06.457 に答える