web-dev-qa-db-ja.com

最適な暗号化作業係数は何ですか?

パスワードの保存に Java scryptライブラリ を使用しています。暗号化するときに、Nrpの値が必要になります。そのドキュメントでは、「CPUコスト」、「メモリコスト」、「並列化コスト」と呼んでいますパラメーター。唯一の問題は、それらが具体的に何を意味するのか、またはそれらにとってどのような価値があるのか​​実際にはわからないことです。おそらく、それらは何らかの方法で-t、-m、および-Mスイッチに対応しています Colin Percivalの元のアプリ

誰かこれについて何か提案はありますか?ライブラリ自体にはN = 16384、r = 8、p = 1がリストされていますが、これが強いか弱いか、または何であるかはわかりません。

65

はじめに:

cpercivalが言及 2009年の彼のスライドで 周りの何か

  • (N = 2 ^ 14、r = 8、p = 1)<100ms(インタラクティブな使用)、および
  • (N = 2 ^ 20、r = 8、p = 1)<5秒(機密ストレージ)。

これらの値は、今日(2012-09)でも、一般的な使用(一部のWebAppの場合はpassword-db)に十分対応できます。もちろん、詳細はアプリケーションによって異なります。

また、これらの値は(主に)意味します。

  • N:一般的な作業係数、反復回数。
  • r:基礎となるハッシュに使用中のブロックサイズ。相対的なメモリコストを微調整します。
  • p:並列化係数;相対CPUコストを微調整します。

rpは、CPU速度とメモリサイズ、および帯域幅が予想どおりに増加しないという潜在的な問題に対応するためのものです。 CPUパフォーマンスがより速く向上する場合はpを増やし、代わりにメモリテクノロジーのブレークスルーが桁違いに向上する場合はrを増やします。そしてNは、一部のタイムスパンごとのパフォーマンスの一般的な倍増に追いつくためにあります。

重要:すべての値は結果を変更します。 (更新:)これが、すべてのscryptパラメータが結果文字列に格納される理由です。

65
gimpf

Scryptが動作するために必要なメモリは、次のように計算されます。

128バイト×N_cost×r_blockSizeFactor

引用するパラメータ(N=16384r=8p=1

128×16384×8 = 16,777,216バイト= 16 MB

パラメータを選択するときは、これを考慮する必要があります。

Bcryptは、4 KBのメモリしか必要としないため、Scryptよりも「弱い」(ただし、 PBKDF2より3桁大きい )です。ハードウェアでのクラックの並列化を困難にしたい。たとえば、ビデオカードに1.5 GBのオンボードメモリがあり、1 GBのメモリを消費するようにscryptを調整した場合:

128×16384×512 = 1,073,741,824バイト= 1 GB

その後、攻撃者はそれをビデオカード上で並列化できませんでした。ただし、アプリケーション/電話/サーバーは、パスワードを計算するたびに1 GBのRAMを使用する必要があります。

これは、scryptパラメータを長方形と考えるのに役立ちます。どこ:

  • 幅は必要なメモリの量です(128 * N * r)
  • 高さは実行された反復の数です
  • 結果として生じる領域は全体的な硬度です

enter image description here

  • cost[〜#〜] n [〜#〜])はメモリ使用量iterationsの両方を増加させます。
  • blockSizeFactorr)はメモリ使用量を増やします。

残りのパラメーターparallelizationp)は、すべてのことを2、3、またはそれ以上実行する必要があることを意味します。

enter image description here

CPUよりもメモリが多い場合は、3つの別々のパスを並列で計算できます。3倍のメモリが必要です。

enter image description here

しかし、すべての実際の実装では、それは連続して計算され、必要な計算が3倍になります。

enter image description here

実際には、誰もp=1以外のp係数を選択したことはありません。

理想的な要素は何ですか?

  • できる限りRAM
  • できる限りの時間をかけてください!

ボーナスチャート

上記のグラフィックバージョン:

enter image description here

ノート:

  • 縦軸は対数目盛
  • コスト係数(水平)自体はログ(反復= 2)CostFactor
  • r=8曲線で強調表示

上記のバージョンを適切な領域に拡大しました。

enter image description here

53
Ian Boyd

私は上記の優れた答えを踏み出したくありませんが、なぜ「r」がその価値を持っているのかについては誰も話しません。 Colin PercivalのScryptペーパーによって提供された低レベルの答えは、「メモリレイテンシ-帯域幅積」に関連しているということです。しかし、それは実際にはどういう意味ですか?

Scryptを正しく実行している場合は、大部分がメインメモリ内にある大きなメモリブロックが必要です。メインメモリからのプルには時間がかかります。ブロックジャンプループの反復が最初に大きなブロックから要素を選択して作業バッファーに混合するとき、最初のデータチャンクが到着するまで100 nsのオーダーで待機する必要があります。それからそれは別のものを要求し、それが到着するのを待つ必要があります。

R = 1の場合、4nr Salsa20/8反復およびを実行し、メインメモリから2nのレイテンシが埋め込まれた読み取りを行います。

これは、攻撃者がメインメモリへの待機時間を短縮したシステムを構築することにより、あなたよりも有利になる可能性があることを意味するため、良くありません。

しかし、rを増やし、それに比例してNを減らすと、以前と同じメモリ要件を達成し、同じ数の計算を実行できます。ただし、ランダムアクセスを順次アクセスと交換した場合を除きます。順次アクセスを拡張すると、CPUまたはライブラリのいずれかが、次に必要なデータブロックを効率的にプリフェッチできます。初期レイテンシがまだ残っている間、後のブロックのレイテンシが削減または排除されると、初期レイテンシは平均して最小レベルになります。したがって、攻撃者はメモリ技術をあなたのものより向上させることからほとんど利益を得ません。

ただし、rの増加に伴って収益が減少する点があり、これは前に参照した「メモリレイテンシ-帯域幅積」に関連しています。この製品が示すのは、メインメモリからプロセッサに転送されるデータのバイト数です。これは高速道路と同じ考えです-ポイントAからポイントB(待ち時間)までの移動に10分かかり、道路がポイントA(帯域幅)からポイントBまで10台/分を提供する場合、ポイントAとポイントの間の道路Bには100台の車が含まれています。したがって、最適なrは、最初のリクエストのレイテンシをカバーするために一度にリクエストできる64バイトのデータチャンクの数に関係します。

これにより、アルゴリズムの速度が向上し、必要に応じて、メモリと計算を増やすためにNを増やすか、計算を増やすためにpを増やすことができます。

「r」を大きくしすぎると、他にもいくつかの問題があります。これについては、あまり説明していません。

  1. Nを減らしながらrを増やすと、メモリ周辺の疑似ランダムジャンプの数が減ります。順次アクセスは最適化が容易であり、攻撃者にウィンドウを与える可能性があります。 Colin PercivalがTwitterで指摘したように、rが大きいほど、攻撃者は低コストで低速のストレージテクノロジーを使用でき、コストを大幅に削減できます( https://Twitter.com/cperciva/status/66137393187022848 )。
  2. 作業バッファーのサイズは1024rビットであるため、最終的にPBKDF2に送信されてScrypt出力キーを生成する可能性のある最終製品の数は2 ^ 1024rです。大規模メモリブロックの周りのジャンプの順列(可能なシーケンス)の数は2 ^ NlogNです。これは、メモリジャンプループの2 ^ NlogNの可能な製品があることを意味します。 1024r> NlogNの場合、それは作業バッファーが混合不足であることを示しているようです。私は確かにこれを知らないので、証明または反証を見たいと思いますが、作業間で相関関係が見つかる可能性があります可能性がありますバッファの結果とジャンプのシーケンス。これにより、攻撃者は、計算コストを大幅に増加させることなく、メモリ要件を削減することができます。繰り返しますが、これは数値に基づく観察結果です。すべてのラウンドですべてが十分に混合されているため、問題ではない可能性があります。標準のN = 2 ^ 14の場合、r = 8はこの潜在的なしきい値をはるかに下回ります。N= 2 ^ 14の場合、このしきい値はr = 224になります。

すべての推奨事項を要約するには:

  1. デバイスのメモリレイテンシの影響を平均化するのに十分な大きさになるようにrを選択します。 Colin Percivalが推奨する値r = 8は、メモリテクノロジに対してはかなり最適のままであるように見え、これは明らかに8年間あまり変化していません。 16は少し良いかもしれません。
  2. スレッドごとに使用するメモリのチャンクの大きさを決定します。これは計算時間にも影響することを念頭に置き、それに応じてNを設定します。
  3. 使用量が許容できる範囲までpを任意に高く(注:私のシステムで、独自の実装を使用している場合、N = 16384でp = 250(4スレッド)、r = 8は約5秒かかります)、対処できる場合はスレッド化を有効にしますメモリコストが追加されます。
  4. 調整するときは、pと計算時間を増やすよりも、Nとメモリブロックのサイズを大きくすることをお勧めします。 Scryptの主な利点は、メモリブロックサイズが大きいことです。

一定の128Nr = 16 MBおよびp = 230を使用した、i5-4300(2コア、4スレッド)を備えたSurface Pro 3でのScryptの私自身の実装のベンチマーク。左軸は秒、下軸はr値、エラーバーは+/- 1標準偏差:

Scrypt r values vs. p with constant large block size

11
Nick Bauer