SecureString каким-то образом защищает экземпляр строки в памяти, однако вы должны знать о некоторых существенных недостатках.
- SecureString (как указывает svick) можно получить безключ дешифрования, поэтому любой хакер, достаточно опытный для извлечения этого фрагмента памяти, который вы можете с уверенностью предположить, может легко выполнить эту незначительную операцию для получения строки в виде простого текста.Рассмотрим простоту
SecureStringToBSTR(input);
SecureString необходимо заполнять символьно-символьным способом, так как нет свойства .Text для использования метода доступа Get или Set.В блогах, включая MSDN, вы часто видите код, подобный следующему:
public static SecureString StringToSecureString(string input)
{
SecureString output = new SecureString();
int l = input.Length;
char[] s = input.ToCharArray(0, l);
foreach (char c in s)
{
output.AppendChar(c);
}
return output;
}
Существенная проблема этого кода заключается в том, что разработчик разрешил строке input
ever существует в памяти в первую очередь.Пользовательский элемент управления или WinForm TextBox для PasswordBox, используемый для сбора этого пароля от пользователя, никогда не должен собирать весь пароль за одну операцию, так как
- Хакеры могут напрямую обращаться к памяти и получать пароль непосредственно из элемента управления накод стека или ввода для извлечения пароля при создании этого метода
- Если ваш последний дамп памяти все еще находится на вашем компьютере с вашего последнего синего экрана, и этот элемент управления был заполнен вашим простым текстовым паролем, тогдапароль находится в маленьком аккуратном файле, готовом для того, чтобы ваш хакер мог его взять и использовать на досуге.
Вместо этого рассмотрите варианты, в которых KeyPress используется для получения каждого символа от пользователя, в противном случаеЯ полагаю, что PasswordBox WPF по умолчанию поддерживается SecureString (кто-то другой может это подтвердить).
Наконец, есть гораздо более простые способы сбора паролей от пользователей, таких как Key Loggers.Я рекомендую рассмотреть демографические данные вашего пользователя, риск подверженности и определить, действительно ли что-то вроде тривиальное как SecureString действительно уменьшит его.