web-dev-qa-db-ja.com

単一のパスワード/キーのキー導出関数を計算するときに並列処理を使用することは可能ですか?

AES-256暗号化ファイルがあり、PBKDF2と多数のラウンド(たとえば100万)の特定のソルトを使用してキーを取得したいが、パスワードを入力するときのUIラグに対するユーザーの許容範囲によって制限されているとします。 。同じパスワードと100個の異なるソルトから100個のキーを10000ラウンド並列で計算し、SHA-256などのハッシュ関数でハッシュすることで、同様にクラッキングに強いキーを計算することは可能ですか?

標準的な方法は基本的にこれです:

key = pbkdf2(pseudo_random_function, password, salt, 1000000, 256);

並列化可能な方法は次のようになります。

for(i = 0; i < 100; i++)  // parallelize this on the GPU/FPGA etc
{
  partial_keys[i] = pbkdf2(pseudo_random_function, password, salts[i], 10000, 256);
}
key = sha256(concatenate(partial_keys[0] ... partial_keys[99]));

導出方法がクラッカーに知られていると仮定すると、これにより、標準的な方法と同様にクラッキングが困難なキーが生成され、安全であるでしょうか。そうでない場合、通常のアプローチを使用した同等のラウンド数に関して、おおよそどの程度安全でしょうか(安全である場合)。

おそらく、100個のソルトを保存する必要はありません。1個のソルトを保存し、キーストレッチング技術/ブロック暗号などを使用して100個の異なるソルトを生成できます。これがアプリケーションで使用された場合、最小のGPU機能を想定または適用できます。ユーザーにインストールを許可する前に。

これのポイントは、スループット(クラッカーによって特定の計算能力で特定の期間に取得できるキーの数)を増やすことなく、レイテンシー(ユーザーの単一のキーを取得するのにかかる時間)を削減することです。 )。

4
samgak

ほとんどのハッシュ関数は、GPUでの実装を困難にするための対策を講じていますが、並列実行を利用して、パスワードを検証するときに防御側でそれを使用することも実際に可能です。簡単に並列化できるように設計されたアルゴリズムの1つは、 parallel by Steve Thomas です。 Parallelは [〜#〜] phc [〜#〜] のファイナリストであり、レビューを受けましたが、多くの情報を見つけることができませんでした。

したがって、アルゴリズムの背後にある考え方は健全です。実装は私には良さそうですが、本番環境に移行する前に、実際の暗号技術者に尋ねることをお勧めします。

1
Sjoerd