81

Rfc2898DeriveBytesを使用することと単に使用することの違いは何Encoding.ASCII.GetBytes(string object);ですか?

私はどちらのアプローチでも比較的成功しましたが、前者はより長く曲がりくねったアプローチですが、後者は単純で要点があります。どちらも最終的には同じことができるように見えますが、前者を後者よりも使用することのポイントを理解するのに苦労しています。

私が理解できた基本的な概念は、文字列パスワードをバイト配列に変換して、たとえば対称暗号化クラスに使用できるということですAesManaged。RFCクラスを介して、ただし、rfcオブジェクトを作成するときにsalt値とパスワードを使用できるようになります。私はそれがより安全だと思いますが、それでもそれはせいぜい知識のない推測です!また、特定のサイズのバイト配列を返すことができます。

これが私がどこから来たのかを示すためのいくつかの例です:

byte[] myPassinBytes = Encoding.ASCII.GetBytes("some password");

また

string password = "P@%5w0r]>";
byte[] saltArray = Encoding.ASCII.GetBytes("this is my salt");
Rfc2898DeriveBytes rfcKey = new Rfc2898DeriveBytes(password, saltArray);

'rfcKey'オブジェクトは、対称暗号化アルゴリズムクラスで.Keyまたは.IVプロパティを設定するために使用できるようになりました。

すなわち。

RijndaelManaged rj = new RijndaelManaged ();
rj.Key = rfcKey.Getbytes(rj.KeySize / 8); 
rj.IV = rfcKey.Getbytes(rj.Blocksize / 8);

'rj'は準備ができているはずです!

紛らわしい部分...'rfcKey'オブジェクトを使用するのではなく、'myPassInBytes'配列を使用して'rj'オブジェクトの設定に役立てることはできませんか?

私はVS2008でこれを試してみましたが、すぐに答えはNOです。しかし、RFCクラスが私が上で述べた他の代替案よりも使用される理由について、皆さんはより良い知識に基づいた答えを得ましたか?

4

1 に答える 1

197

特にAESでは、ユーザーパスワードを暗号鍵として直接使用することは本当に望ましくありません。

Rfc2898DeriveBytesはPBKDF2の実装です。それが行うことは、ソルトと一緒にユーザーパスワードを繰り返しハッシュすることです。これには複数の利点があります。

まず、任意のサイズのパスワードを使用できます。AESは特定のキーサイズのみをサポートします。

次に、saltを追加すると、同じパスフレーズを使用して複数の異なるキーを生成できるようになります(例のように、saltが定数ではないと仮定します)。これはキーの分離にとって重要です。さまざまなコンテキストでキーを再利用することは、暗号化システムが破られる最も一般的な方法の1つです。

複数の反復(デフォルトでは1000)により、パスワード推測攻撃が遅くなります。AESキーを推測しようとしている人を考えてみてください。パスワードを使用したばかりの場合、これは簡単です。可能な各パスワードをキーとして試してください。一方、PBKDF2では、攻撃者は最初にパスワードの推測ごとに1000回のハッシュ反復を実行する必要があります。そのため、ユーザーの速度はわずかに低下しますが、攻撃者に不釣り合いな影響を及ぼします。(実際、はるかに高い反復回数を使用することは非常に一般的です。10000が一般的に推奨されます)。

また、最終的な出力キーが均一に分散されていることも意味します。たとえば、パスワードを使用した場合、通常、キーの128ビットのうち16ビットは0(上位ASCIIビット)になります。その権利により、パスワードの推測を無視しても、すぐにキー検索が本来の65536倍簡単になります。

最後に、AESには、関連する主要な攻撃に関連する特定の脆弱性があります。関連するキー攻撃は、攻撃者が複数のキーで暗号化されたデータを知っていて、それらの間に既知の(または推測された)関係がある場合に発生する可能性があります。たとえば、「My AES keysucks」(AES-128の場合は16バイト)のパスワードキーと「MYAES KEY SUCKS」の両方でデータを暗号化すると、関連するキー攻撃が発生する可能性があります。現在最もよく知られている攻撃では、実際にはこの方法で完全なAESを破壊することはできませんが、時間の経過とともに徐々に改善されています。先週、AES-256を使用して13ラウンド(合計14ラウンド中)を破壊する新しい攻撃が公開されました。関連するキー攻撃。このような攻撃が時間の経過とともに改善されないことに依存することは、非常に賢明ではありません。

于 2010-05-07T18:16:31.167 に答える