4

暗号の達人は助けてください。

対称アルゴリズム (AES など) を使用した暗号化キーは、各暗号化でランダムソルトを使用して、PBKDF2 関数を介してパスワードから導出する必要があることを学びました。また、IV をハードコーディングしたり、パスワード文字列や暗号化キーに直接バインド (派生) したりしてはならないことも学びました。これまでは、AES-256 暗号化用にそれぞれ 16 バイトのキー派生ソルトとIVの両方をランダムに生成し、暗号化されたペイロードと一緒に保存していました。

ランダムソルトを使用すると、そのソルトを使用してパスワード文字列からキーとIVの両方を導出できるため、IVのランダム生成は冗長であると考えています。それとも、私はすべきではありませんか?

だから私の質問は最終的にこれです:

パスワードから初期化ベクトルを導き出すことはできますか (キーの場合と同様)、または各暗号化でランダムなソルトを使用するという事実を考慮して、毎回ランダムな IV を生成する必要がありますか?

以下の C# コードを使用できますか?

// Derive key and initialization vector from password:

// ---> NOTE: _salt is random 16 bytes in each encryption.

byte[] key, iv;

using (Rfc2898DeriveBytes derivedBytes = new Rfc2898DeriveBytes(password, _salt, _iterations))
{
    key = derivedBytes.GetBytes(32);
    iv = derivedBytes.GetBytes(16);
}
4

4 に答える 4

4

はい、同じパスワードに同じソルトを使用してキーとIVを計算することがない限り、そのように使用できます。IVは、同じキーで暗号化する場合にのみ一意である必要があり、毎回新しいキーを計算します。キーが繰り返されることはないため、原則としてすべてゼロのIVを使用することもできますが、派生キーを使用することをお勧めします。

同僚の1人がPasswordDeriveBytes-MicrosoftのPBKDF1の壊れた実装-がそのタスクにより適していると判断した場合、あなたはあらゆる種類の攻撃に対して非常に脆弱である可能性があることに注意してください。これは、セキュリティマージンが厳しい場合に問題が発生する可能性がある例にすぎません...

完全にランダムなIVが確かに好まれるはずです。

于 2012-09-27T22:46:06.413 に答える
0

AES-CBCを使用する場合の初期化ベクトルのセマンティックセキュリティの最も重要な部分は、予測可能であってはならないということです。

提案された実装では、特定のキーは常に同じ初期化ベクトルを持ちますが、128ビットソルトのために同じキーを使用することはありません。とはいえ、これはベストプラクティスではないようです。一般に、16バイトのスペースを節約するために何か賢いことをすると、ある種のセキュリティが失われたり、未知の攻撃ベクトルにさらされたりします。

RNGを使用し、スペースを16バイトヒットする必要があると思います。暗号化を扱う場合は、保守的にすることがゲームの名前です。認証付き暗号化など、おそらく同様に検討する必要があるものが他にもあります。codereviewの実装例があります。

最終的に、認証付き暗号化、バージョン管理、キーローテーションなど、セキュリティのためにivを超える追加のオーバーヘッドを提供する重要なものが他にもあり、C#用の高レベルの暗号化フレームワークは実際にはありませんでした。私はGoogleのKeyczarフレームワークのC#実装に取り​​組んできました。必要に応じて、 githubKeyczar-dotnetでフォローできます。これはほぼ完全な機能であり、90%のテストカバレッジがありますが、控えめに言って、プロジェクトの一部として正式に受け入れられるまで使用することはお勧めしません。そうすれば、将来的にはより多くの注目を集めるでしょう。

于 2012-09-27T14:21:45.353 に答える
0

「各暗号化でランダムソルトを使用する」とはどういう意味ですか? 暗号化標準の乱数ジェネレーターからの出力など、ソルトと IV をランダムに導出し、導出されたバイトと共に格納するのが最善です。パスワードごとに新しい IV とソルトを生成します。

なぜ暗号化標準 RNG から? パスワードから導出するということは、バイト導出機能の弱点がバイトと IV の両方に反映されることを意味します。最新のプログラミング言語では、RNG から生成することは難しくありません。RNG を使用すると、暗号化された新しいパスワードの IV は予測できなくなります。おそらくもっと良い理由がありますが、私は空白を描いています。

于 2012-09-27T11:32:13.870 に答える