Ви можете мене виправити, якщо мої припущення помиляються тут, але дозвольте мені пояснити, чому я прошу.
Взяте з MSDN SecureString:
Представляє текст, який слід зберігати в таємниці. Текст шифрується для конфіденційності при використанні та видаляється з пам'яті комп'ютера, коли це вже не потрібно.
Я розумію, це має повний сенс зберігати пароль або іншу приватну інформацію в більш SecureStringніж System.String, тому що ви можете контролювати, як і коли він фактично зберігається в пам'яті, оскільки System.String:
він є незмінним і, коли це більше не потрібно, не може бути запрограмований програмно для вивезення сміття; тобто екземпляр читається лише після його створення, і неможливо передбачити, коли екземпляр буде видалений з пам'яті комп'ютера. Отже, якщо об’єкт String містить конфіденційну інформацію, таку як пароль, номер кредитної картки або особисті дані, існує ризик, що інформація може бути розкрита після її використання, оскільки ваша програма не може видалити дані з пам'яті комп'ютера.
Однак у випадку програми GUI (наприклад, ssh-клієнта), SecureString необхідно будувати з а System.String . Усі текстові елементи керування використовують рядок як основний тип даних .
Отже, це означає, що кожного разу, коли користувач натискає клавішу, старий рядок, який там був, відкидається, і будується нова рядок, який представляє значення в текстовому полі, навіть якщо використовується маска пароля. І ми не можемо контролювати, коли або якщо якесь із цих значень відкидається з пам'яті .
Тепер настав час увійти на сервер. Вгадай що? Для аутентифікації потрібно пройти рядок через з'єднання . Тож давайте перетворимо наше SecureStringв System.String.... і тепер у нас є рядок на купі, що не може змусити його пройти збирання сміття (або записати 0 в його буфер).
Моя точка : незалежно від того , що ви робите, де - то вздовж лінії, що SecureStringце збирається бути перетворені в System.String, тобто це буде по крайней мере , існує на купі в якій - то момент (без будь - яких гарантій збору сміття).
Моя думка не в тому : чи існують способи обходу відправлення рядка до ssh-з'єднання, або обхід наявного контрольного сховища рядка (зробіть спеціальний елемент управління). Для цього питання ви можете замінити "ssh-з'єднання" на "форму входу", "форму реєстрації", "форму оплати", "продукти-ви-годуєте-годуєте-щеня, але не-ваші діти", тощо.
- Отже, в який момент робить використання a
SecureStringфактично стає практичним? - Чи варто коли-небудь додаткового часу на розробку повністю усунути використання
System.Stringоб'єкта? - Чи є вся суть у тому,
SecureStringщоб просто скоротити кількість часу, щоSystem.Stringзнаходиться на купі (зменшуючи ризик переходу до фізичного файлу своп)? - Якщо у зловмисника вже є засоби для перевірки у купі, він, швидше за все, або (A) вже має засоби для читання натискань клавіш, або (B) вже фізично має автомат ... Так, якщо використовувати
SecureStringзапобігання йому потрапити до дані все одно? - Це просто "безпека через неясність"?
Вибачте, якщо я задаю питання надто густо, цікавість просто покращила мене. Не соромтесь відповісти на будь-яке або всі мої запитання (або скажіть, що мої припущення абсолютно неправильні). :)
SecureStringнасправді це не захищена рядок. Це просто спосіб зменшити вікно часу, протягом якого хтось може перевірити вашу пам'ять і успішно отримати конфіденційні дані. Це не куленепроникне, і цього не передбачалося. Але бали, які ви набираєте, дуже справедливі. Пов’язано: stackoverflow.com/questions/14449579/…