8

タイプGetPasswordを返す関数があります。SecureString

このセキュリティで保護された文字列を に渡しRfc2898DeriveBytesてキーを生成すると、Visual Studio でエラーが表示されます。私の限られた知識によるとRfc2898DeriveBytes、安全な文字列ではなく文字列のみを受け入れるためです。これに対する回避策はありますか?

//read the password from terminal
Console.Write("Insert password");
securePwd = myCryptography.GetPassword();

//dont know why the salt is initialized like this
byte[] salt = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xF1, 0xF0, 0xEE, 0x21, 0x22, 0x45 };
 try
 {   //PBKDF2 standard 
     Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(securePwd, salt, iterationsPwd);
4

3 に答える 3

6

どうやら、関数によって提供される保護に違反し、その内部状態を公開するSecureStringことができます。Marshal.SecureStringToBSTR()

結果から を作成するのではなくString、コンテンツを にコピーしてByte[]に渡しRfc2898DeriveBytesます。. String_ 代わりに、配列をゼロで埋めることにより、使用が終了したらすぐにパスワードを破棄する必要があります。同じ理由で、 にBSTRコピーするときにの各要素にもゼロを割り当てる必要がありますByte[]

ソルトは、固定された予測可能な値ではなく、ハッシュされたパスワードごとにランダムに選択する必要があります。そうしないと、事前に計算された辞書攻撃が可能になります。ブルート フォース攻撃を防ぐために、何万回も繰り返す必要があります。

于 2012-03-17T15:47:35.453 に答える
5

いくつかの調査を行い、スタックオーバーフローの言及に関する以前の回答を見た後SecureString、その答えはほぼ確実に「いいえ」です。API の作成者のみが、API を内部で受け入れSecureStringて正しく処理できます。そして、彼らはプラットフォームの助けを借りてのみそれを行うことができます.

ユーザーとしてプレーン テキストを取得できた場合、そもそもStringを使用する利点のほとんどを無効にすることになります。SecureString安全に見えるコードを作成すると、実際にはまったく安全ではないため、少し危険です(編集:少なくともメモリ内データの保護に関してはそうではありません)。

于 2012-03-17T15:25:24.360 に答える