9

このアプリは、ユーザーがドキュメントの暗号化解除に使用するパスワードを入力するテキスト ボックスを含むフォームを表示します。

次のようなコードがあります。

string password = passwordTextBox.Text;
...
DecryptDocument(password);

しかし、技術的に言えば、これはセキュリティ上の欠陥であると言われました。アプリケーションを閉じた後でも、パスワードを表すデータがメモリに残る可能性があるからです。

System.Security.SecureString クラスを使用しようとしましたが、CoTaskMem へのポインターを処理しているため、問題が悪化しているようです。

SecureString password = new SecureString();
foreach(char i in passwordTextBox.Text.ToCharArray())
password.AppendChar(i);

IntPtr ptr = Marshal.SecureStringToCoTaskMemAnsi(password);
int length = password.Length;
byte[] bytes = new byte[length];

Marshal.Copy(ptr, bytes, 0, length);

DecryptDocument(Encoding.Default.GetString(bytes));

Marshal.FreeCoTaskMem(ptr);

ご覧のとおり、アプリケーションをより安全にしているようには見えません。遅かれ早かれ、入力 (passwordTextBox.Text) を受け取り、DecryptDocument() に渡すことができる文字列に変換する必要があるからです。関数。

この問題を解決する方法はありますか? または、このセキュリティの脆弱性に対処する必要がありますか?

4

1 に答える 1

9

本当に SecureString を使用したい場合は、エンド ツー エンドで使用する必要があります。文字列が文字配列に復号化されるときはいつでも、使い終わったときにメモリを明示的にクリアする必要があります。この結果:

  1. SecureString を直接操作する安全な TextBox コントロールを使用する必要があります。良い例については、こちらを参照してください。

  2. SecureString を直接受け取るように DecryptDocument を変更する必要があります。

  3. 復号化を実装して、復号化された文字にできるだけ時間を費やさないようにする必要があります。.NET の暗号化アーキテクチャの一部は、実際に SecureString を直接サポートしています。それができない場合は、アンマネージ バッファを使用し、使い終わったら明示的にクリアするのが最善の策です。

于 2012-06-15T15:18:23.423 に答える