Ви можете мене виправити, якщо мої припущення помиляються тут, але дозвольте мені пояснити, чому я прошу.
Взяте з 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/…