このアプリは、ユーザーがドキュメントの暗号化解除に使用するパスワードを入力するテキスト ボックスを含むフォームを表示します。
次のようなコードがあります。
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() に渡すことができる文字列に変換する必要があるからです。関数。
この問題を解決する方法はありますか? または、このセキュリティの脆弱性に対処する必要がありますか?