18

TripleDes、DESなどのSymmetricAlgorithmから継承されたクラスに基づく暗号化機能に取り組んでいます。

基本的に、アルゴリズムクラスの一貫したキーとIVを生成するための2つのオプションがPasswordDeriveBytesありRfc2898DeriveBytes、どちらもDeriveBytes抽象クラスから継承します。

このPasswordDeriveBytes.GetBytes()メソッドは、.NET Frameworkで廃止としてマークされていますが、PBKDF2標準に一致するため、Rfc2898DeriveBytes.GetBytes()をお勧めします。ただし、私のテストに基づくと、GetBytes()Rfc2898DeriveBytesクラスで同じメソッドを呼び出すと、クラスのメソッドよりもほぼ15倍遅くなり、PasswordDeriveBytes予期しないCPU使用率(常に50%を超える)が発生します。

ここにいくつかのテストデータがあります:

  • 反復:100
  • アルゴリズムタイプ:DES
  • 元のテキスト:「私はテストキーです。暗号化してください」
  • 時間:
    • PasswordDeriveBytes:99ms
    • Rfc2898DeriveBytes:1,373ms

テストに基づくと、のパフォーマンスの低下はRfc2898DeriveBytes実稼働環境では許容できません。

誰かが以前にこの問題に気づいたことがありますか?パフォーマンスに影響を与えることなく、標準のソリューションを引き続き使用できるソリューションはありますか?廃止された方法を使用するリスクはありますか(将来のバージョンで削除される可能性があります)?

みんなありがとう!

編集:

おそらく問題がどこにあるかを見つけました...のデフォルトの反復回数PasswordDeriveBytesは100ですが、Rfc2898DeriveBytesは1000です。1000と同じ数に変更した後、実行Rfc2898DeriveBytesは2倍の時間になります。

4

3 に答える 3

27

それらは同じものではありません。

Rfc2898DeriveBytesはPBKDF2の実装です。PasswordDeriveBytesはPBKDF1の実装です。PBKDF2は、異なる方法を使用して異なる出力を生成し、PBKDF1よりもはるかに多くのラウンド数を生成します。

キーの導出に使用されるこれらのようなパスワードハッシュ関数は遅いと思われます。それがポイントです-それは彼らをクラックすることをはるかに難しくします。

2つの関数には互換性がなく、PasswordDeriveBytesはそれほど安全ではありません。

于 2009-08-31T11:14:41.537 に答える
11

私はあなたがderivebytesのポイントを逃していると思います。遅いはずです。巧妙なトリックではスピードアップできない遅いアルゴリズムを意図的に使用しています。一般的な「反復回数」パラメーターは2^16〜2 ^ 20の範囲であり、ユーザーがパスワードを入力してからキーが生成されるまでに0.1〜0.5秒の遅延が発生する必要があります。その意図は、「怠惰な無知なユーザー」によって選択された弱いパスワードから防御し、ブルートフォース検索を遅くすることです。

于 2012-02-01T19:24:56.300 に答える
10

このブログ投稿では、2つの違いについて説明しています。http://blogs.msdn.com/shawnfa/archive/2004/04/14/generated-a-key-from-a-password.aspx

于 2009-08-31T11:07:22.177 に答える