私はここでかなり明白な質問をしているように感じますが、この領域で間違いを犯しやすいので、ここに行きます。
wikipedia から:
DK = PBKDF2(PRF、パスワード、Salt、c、dkLen)
dkLenは、派生キーの必要な長さです
「望ましい長さ」を決定するにはどうすればよいですか?
PBKDF2の出力長は必要な長さです。しかし、詳細があります。
PBKDF2は Key Derivation Function です:構成可能な長さのバイトシーケンスを生成し、その目的は次のように使用されます。一部の対称暗号化アルゴリズム(またはMAC)のキー。したがって、最初の応答は次のとおりです。たとえば、19バイトの鍵を期待する対称暗号化アルゴリズムを使用する場合、PBKDF2から19バイトが必要です。
詳細は次のとおりです。
PBKDF2には、ブロックごとにデータを生成するという欠点があり、コストは、要求するブロックの数に比例します。たとえば、内部PRFとしてHMAC/SHA-1を使用してPBKDF2を使用する場合(これは通常のケースです)、20のブロックごとにバイトを取得します。たとえば、24バイトが必要な場合、PBKDF2は2つのブロックを生成する必要があります。これは、20バイト以下にする場合の2倍のコストになります。
PBKDF2は、パスワードの徹底的な検索を無効にするために意図的に遅くなっているため、これは残念です。ただし、PBKDF2出力の使用方法によっては、攻撃者はPBKDF2出力の最初のブロックでのみパスワードを「テスト」できる可能性があります。実際には、これにより攻撃者のパフォーマンスがx2またはx3向上する可能性があり、逆効果になります。
推奨される回避策は、PBKDF2(たとえば、20バイト)で出力のoneブロックを生成し、これらの20バイトを別の高速KDFで拡張することです。必要なだけのバイトに。 [〜#〜] hkdf [〜#〜] は評判の良い高速KDFです。
PBKDF2はしばしば password hashing に悪用されます。パスワードハッシュでは、出力を実際に使用するのではなく、後で比較するために保存するだけです。このような用途では、攻撃者が「幸運」にならないように、十分に多くのバイトを格納する必要があります。格納されたものと一致する出力を見つけることは圧倒的にありえないはずです。パスワードハッシュにPBKDF2を使用する場合、無視できないセキュリティマージンで12バイトの出力で問題ありません。
出力をパスワードハッシュに使用している場合、出力の長さ:
出力を単一の暗号化キーとしてのみ直接使用している場合:
暗号化キーとMACの両方として出力を使用している場合、または複数の目的で出力を使用しているその他の場合:
「ネイティブハッシュの出力サイズ以下」の理由は、PBKDF2定義の RFC2898 セクション5.2で、ネイティブハッシュ関数が提供するよりも多くの出力バイト(dkLen)が要求された場合に、最初のネイティブハッシュサイズの完全な反復カウントを実行し、次に2番目の完全な反復カウントを実行し、完了するまで、または必要なものの残りがネイティブの出力サイズより小さいために出力を切り捨てる必要があるまで続行します。