パスワードの保存に Java scryptライブラリ を使用しています。暗号化するときに、N
、r
、p
の値が必要になります。そのドキュメントでは、「CPUコスト」、「メモリコスト」、「並列化コスト」と呼んでいますパラメーター。唯一の問題は、それらが具体的に何を意味するのか、またはそれらにとってどのような価値があるのか実際にはわからないことです。おそらく、それらは何らかの方法で-t、-m、および-Mスイッチに対応しています Colin Percivalの元のアプリ ?
誰かこれについて何か提案はありますか?ライブラリ自体にはN = 16384、r = 8、p = 1がリストされていますが、これが強いか弱いか、または何であるかはわかりません。
はじめに:
cpercivalが言及 2009年の彼のスライドで 周りの何か
これらの値は、今日(2012-09)でも、一般的な使用(一部のWebAppの場合はpassword-db)に十分対応できます。もちろん、詳細はアプリケーションによって異なります。
また、これらの値は(主に)意味します。
N
:一般的な作業係数、反復回数。r
:基礎となるハッシュに使用中のブロックサイズ。相対的なメモリコストを微調整します。p
:並列化係数;相対CPUコストを微調整します。r
とp
は、CPU速度とメモリサイズ、および帯域幅が予想どおりに増加しないという潜在的な問題に対応するためのものです。 CPUパフォーマンスがより速く向上する場合はp
を増やし、代わりにメモリテクノロジーのブレークスルーが桁違いに向上する場合はr
を増やします。そしてN
は、一部のタイムスパンごとのパフォーマンスの一般的な倍増に追いつくためにあります。
重要:すべての値は結果を変更します。 (更新:)これが、すべてのscryptパラメータが結果文字列に格納される理由です。
Scryptが動作するために必要なメモリは、次のように計算されます。
128バイト×
N_cost
×r_blockSizeFactor
引用するパラメータ(N=16384
、r=8
、p=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パラメータを長方形と考えるのに役立ちます。どこ:
cost
([〜#〜] n [〜#〜])はメモリ使用量とiterationsの両方を増加させます。blockSizeFactor
(r)はメモリ使用量を増やします。残りのパラメーターparallelization
(p)は、すべてのことを2、3、またはそれ以上実行する必要があることを意味します。
CPUよりもメモリが多い場合は、3つの別々のパスを並列で計算できます。3倍のメモリが必要です。
しかし、すべての実際の実装では、それは連続して計算され、必要な計算が3倍になります。
実際には、誰もp=1
以外のp
係数を選択したことはありません。
理想的な要素は何ですか?
上記のグラフィックバージョン:
ノート:
r=8
曲線で強調表示上記のバージョンを適切な領域に拡大しました。
私は上記の優れた答えを踏み出したくありませんが、なぜ「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」を大きくしすぎると、他にもいくつかの問題があります。これについては、あまり説明していません。
すべての推奨事項を要約するには:
一定の128Nr = 16 MBおよびp = 230を使用した、i5-4300(2コア、4スレッド)を備えたSurface Pro 3でのScryptの私自身の実装のベンチマーク。左軸は秒、下軸はr値、エラーバーは+/- 1標準偏差: