Не стесняйтесь исправлять меня, если мои предположения здесь неправильны, но позвольте мне объяснить, почему я спрашиваю.
Взято из MSDN, a SecureString
:
Представляет собой текст, который должен быть конфиденциальным. Текст зашифровывается для обеспечения конфиденциальности при использовании и удаляется из памяти компьютера, когда он больше не нужен.
Я получаю это, имеет смысл хранить пароль или другую личную информацию в SecureString
поверх System.String
, потому что вы можете контролировать, как и когда он фактически хранится в памяти, потому что System.String
:
является неизменным и, когда он больше не нужен, не может быть программно запланирован для сбора мусора; то есть экземпляр доступен только для чтения после его создания, и невозможно предсказать, когда экземпляр будет удален из памяти компьютера. Следовательно, если объект String содержит конфиденциальную информацию, такую как пароль, номер кредитной карты или личные данные, существует риск того, что информация может быть обнаружена после ее использования, потому что ваше приложение не может удалить данные из памяти компьютера.
Однако, в случае приложения GUI (например, ssh-клиент), SecureString
должен быть построен из System.String
. Все текстовые элементы управления используют строку в качестве базового типа данных.
Таким образом, это означает, что каждый раз, когда пользователь нажимает клавишу, старая строка, которая была там, отбрасывается, и создается новая строка для представления того, что значение внутри текстового поля, даже если используется маска пароля. И мы не можем контролировать, когда или любое из этих значений будет отброшено из памяти.
Теперь пришло время входа на сервер. Угадай, что? Для аутентификации вам необходимо передать строку. Поэтому давайте преобразуем наш SecureString
в System.String
.... и теперь у нас есть строка в куче без возможности заставить ее пройти сборку мусора (или записать 0 в ее буфер).
Моя точка: независимо от того, что вы делаете, где-то вдоль линии, SecureString
будет преобразована в System.String
, что означает, что она, по крайней мере, будет существовать в куче на (без каких-либо гарантий сбора мусора).
Моя точка зрения не: существуют ли способы обхода отправки строки в ssh-соединение или обход содержимого контрольной таблицы (создание настраиваемого элемента управления). Для этого вопроса вы можете заменить "ssh connection" на "регистрационную форму", "регистрационную форму", "форму оплаты", "формулу" еда-вы-кормит-ваш-щенок, но не ваш ребенок "", и др.
- Итак, в какой момент использование
SecureString
действительно становится практическое? - Стоит ли лишнее время разработки полностью искоренить
использование объекта
System.String
? - Является ли целая точка
SecureString
просто уменьшать количество времени aSystem.String
на куче (уменьшая риск перехода в файл физической подкачки)? - Если у злоумышленника уже есть средство для проверки кучи, то он, скорее всего, либо (A) уже имеет средства для чтения нажатий клавиш, либо (B) уже физически имеет машину... Так что, используя
SecureString
не позволять ему в любом случае добраться до данных? - Это просто "безопасность через неясность"?
Извините, если я задаю слишком сложные вопросы, любопытство только что улучшило меня. Не стесняйтесь отвечать на все или на все мои вопросы (или скажите мне, что мои предположения совершенно неверны).:)