Не стесняйтесь поправлять меня, если мои предположения здесь неверны, но позвольте мне объяснить, почему я спрашиваю.
Взято из 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/…