Как правильно обращаться с конфиденциальными данными, такими как пароль, в C#?

Это приложение отображает форму с текстовым полем, где пользователь должен ввести пароль, используемый для расшифровки документа.

У меня есть такой код:

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().

Есть ли способ решить эту проблему или мне просто нужно устранить эту уязвимость?

9
задан John Smith 15 June 2012 в 15:11
поделиться