web-dev-qa-db-ja.com

PBKDF2から要求する出力長を知る方法は?

私はここでかなり明白な質問をしているように感じますが、この領域で間違いを犯しやすいので、ここに行きます。

wikipedia から:

DK = PBKDF2(PRF、パスワード、Salt、c、dkLen)

dkLenは、派生キーの必要な長さです

「望ましい長さ」を決定するにはどうすればよいですか?

8
user50849

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バイトの出力で問題ありません。

9
Thomas Pornin

出力をパスワードハッシュに使用している場合、出力の長さ:

  • ネイティブハッシュの出力サイズ以下でなければなりません
    • SHA-1は20バイト、SHA-224は28バイト、SHA-256は32バイト、SHA-384は48バイト、SHA-512は64バイト
  • リスク許容度以上でなければなりません。実際には、20バイト(SHA-1ネイティブ出力サイズ)未満は小さすぎると思います。

出力を単一の暗号化キーとしてのみ直接使用している場合:

  • 必要な暗号化キーのサイズと同じである必要があります
    • 理想的には、ネイティブハッシュの出力サイズ(上記を参照)以下である

暗号化キーとMACの両方として出力を使用している場合、または複数の目的で出力を使用しているその他の場合:

「ネイティブハッシュの出力サイズ以下」の理由は、PBKDF2定義の RFC2898 セクション5.2で、ネイティブハッシュ関数が提供するよりも多くの出力バイト(dkLen)が要求された場合に、最初のネイティブハッシュサイズの完全な反復カウントを実行し、次に2番目の完全な反復カウントを実行し、完了するまで、または必要なものの残りがネイティブの出力サイズより小さいために出力を切り捨てる必要があるまで続行します。

6