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