1

以前の質問に触発されて、今では非常に興味深いアイデアがあります。Rfc2898DeriveBytesパスフレーズ文字列から暗号化キーと初期化ベクトルを「安全に派生」させるために、または同様のクラスを使用する必要があるのでしょうか、それともその文字列の単純なハッシュが機能するのでしょうか。対称アルゴリズム(AES、DESなど)でデータを暗号化する場合、キー/ IVと同様にうまくいきますか?

大量のAES暗号化コードスニペットが表示されます。Rfc2898DeriveBytesclassは、パスワード文字列から暗号化キーと初期化ベクトル(IV)を導出するために使用されます。暗号化に十分な安全性のあるキー/IVを導出するには、ランダムなソルトと大量の反復を使用する必要があると想定されています。この方法を使用してパスワード文字列からバイトを導出することは、一部のシナリオでは非常に便利ですが、対称アルゴリズムを使用してデータを暗号化する場合は適用できないと思います。その理由は次のとおりです。事前に計算されたレインボーテーブルを作成する可能性がある場合はsaltを使用するのが理にかなっており、攻撃者がハッシュを入手すると、結果として元のパスワードを検索します。しかし...対称データ暗号化では、パスワード文字列のハッシュまたは暗号化キーがどこにも保存されないため、これは必要ないと思います。したがって、パスワードのSHA1ハッシュを取得し、それを暗号化キー/ IVとして使用する場合は、そうではありません。

そのパスワードのSHA1(またはその他の)ハッシュを使用できる場合、クラスを使用してパスワード文字列からキー/ IVを生成する目的は何ですかRfc2898DeriveBytes(これは非常にパフォーマンスが高い操作です)。ハッシュを使用すると、(文字列バイトを直接使用するのではなく)キーにランダムなビット分散が発生します。そして、攻撃者はとにかくキーの全範囲をブルートフォースする必要があります(たとえば、キーの長さが256ビットの場合、2 ^ 256の組み合わせを試す必要があります)。

Rfc2898DeriveBytesしたがって、私が危険な方法で間違っているか、暗号化キーとIVを生成する方法を使用するAES暗号化のすべてのサンプル(ここSOでの多くの賛成の回答を含む)などがちょうど間違っています。

4

3 に答える 3

1

パスワードのハッシュを暗号化キーとして使用する場合、暗号化ごとに異なるキーになるため、攻撃者は少なくとも一部の暗号化された値を非常に簡単に攻撃できます( "password123"、 "chocolate"などをハッシュすることにより) 。対称暗号化を保護するための最良の方法は、誰にも盗聴されないように管理される長くて単一の鍵です。
Rfc2898DeriveBytesの使用に関する最初の質問に関して、これのポイントは、パスワードから取得するキーが、コピーやブルートフォース攻撃が困難な方法で行われるようにすることです。プロセスにエントロピーを追加します。パスワードを取得してから単純なハッシュを実行した場合、暗号化に使用されるパスワードは弱く(文字セットと長さが制限されている)、予測可能です。

于 2012-09-21T15:36:39.030 に答える
1

また、攻撃者はキーの全範囲をブルートフォースする必要があります(たとえば、キーの長さが256ビットの場合、2 ^ 256の組み合わせを試す必要があります)

これはあなたが間違っているところです。弱いパスワードがたとえば8文字で、ASCII文字ごとに約5ビットある場合、約(2 ^ 5)^8の弱いパスワードがあります。これは約2^40です。ソルトを使用していないため、可能なキーは2^40のみです。これらのキーは、8文字の可能な組み合わせを繰り返し処理し、それぞれをハッシュすることで簡単に生成できます。これは、2^256よりもブルートフォース攻撃がかなり簡単です。

于 2012-09-21T16:16:32.363 に答える
0

のポイントはRfc2898DeriveBytes遅くなることです。
ハッシュを1,000回以上繰り返すと、ブルートフォースによるパスワードの推測が桁違いに遅くなります。

于 2012-09-21T15:29:46.380 に答える