1

データベース内の機密データの暗号化シーケンスを作成しています。

現在、UserIdに基づいてGUIDを取得し、それをハッシュに通しています。次に、Rfc2898DeriveBytesを介してハッシュを実行し、Rijndael関数を使用してデータを暗号化するために使用するキーとIVを取得します。

私のコードは次のようになります:

        var salt = new byte[] { 1, 2, 23, 234, 37, 48, 134, 63, 248, 4 };
        const int iterations = 1000;
        using (var rfc2898DeriveBytes = new Rfc2898DeriveBytes(GenerateHash("2525"), salt, iterations)) {
            _key = rfc2898DeriveBytes.GetBytes(32);
            _iv = rfc2898DeriveBytes.GetBytes(16);
        }

次に、_keyと_ivを渡して、データを復号化または暗号化します。私の目標は、各ユーザーがすべてのセッションを通じて常に一意のキーにアクセスできるようにすることです。そうは言っても、何をランダム化してこの機能を維持できるのでしょうか。必要なデータを取得するには、常に同じソルトと同じIVを使用する必要がありますか?

4

1 に答える 1

5

Rfc2898DeriveBytesPBKDF2 の実装です。明らかに、RFC 2898 は、このパスワード ベースのキー派生関数が定義されている標準への参照です。標準は KDF よりも広いことに注意してください。完全なタイトルは「PKCS #5: パスワードベースの暗号化仕様、バージョン 2.0」です。

PBKDF2 は、PBKDF / PBKDF1 を定義した PKCS#5 v1 の後継です。1 は、PBKDF2 が作成された後に追加されました。このクラスPasswordDeriveBytesは PBKDF1 の実装です。KDF が古くなっているだけでなく、Microsoft が実装を大幅に台無しにしたため、もう使用しないでください。基礎となるハッシュの出力 (SHA-1 で 20 バイト) を超える出力が要求された場合、出力キーイング マテリアルを繰り返すことができます。

KDF を除いて、PBKDF2 はパスワード ハッシュ関数としても使用され、パスワードの代わりにハッシュがデータベースに格納されます。このようにして、パスワードを検証できますが、データが敵に取得された場合にパスワードを簡単に取得することはできません。これは、プロトコルの 2.1 バージョンを含むフォローアップRFC 8018で説明されています。

内部的には、PBKDF2 はパスワードとソルトに対するハッシュ関数の単なる繰り返しです。反復回数は作業係数です。1 つのハッシュが計算される前に、あなた (および敵対者) がしなければならない作業量を指定します。ソルトは、レインボー テーブル攻撃が不可能であること、および (複数のユーザーの) 同一のパスワードが同じハッシュにつながらないことを確認します。

複数のハッシュ出力が必要な場合に全量の作業を繰り返す必要があるという設計エラーのため、ハッシュ関数の出力よりも多くのデータを要求することはお勧めしません。その場合、HKDF-Expand など、別の方法を使用して出力キーイング マテリアル (バイト) を拡張することをお勧めします。


質問のコードに関する観察:

  1. GenerateHashメソッドは偽物です。Rfc2898DeriveBytesこれを行います。
  2. キーを作成するには、UID よりも予測しにくいものを使用する必要があります。PBKDF2 の目的を完全に無効にするため、攻撃者がデータを直接利用できるようにすべきではありません。
  3. 複数の暗号化に UID + ソルト + 反復の同じセットを使用する場合は、ランダムな IV を生成して暗号文の先頭に追加する必要があります。非ランダムな IV を使用すると、IV の目的が完全に無効になります。
  4. ソルトを変更して複数のキーを取得できますが、暗号化ごとに PBKDF2 関数を実行する必要があります。

一般的なヒントとして、生成されたキーのみを使用して、安全なランダム関数から作成されたデータ固有のキーを暗号化してください。その後、IV について気にする必要さえありません。また、データ固有のキーを解読し、それを新しいキーで暗号化することで「再暗号化」できる場合があります。

于 2012-08-22T21:07:47.863 に答える