У меня простая форма входа.
После того, как у пользователя есть цифровой пароль, мне нужно уничтожить текстовое поле в памяти.
Достаточно ли этого?
txtPassword.Text = string.Empty;
txtPassword = null;
System.GC.Collect();
Нет. Текст все еще может быть в TextBox; некоторая другая переменная или объект, на который вы можете ссылаться. Возможно, вы захотите рассмотреть WPF PasswordBox и SecureString
Просто txtPassword.Text = string.Empty; не работает?
@MickyD Я передаю текст в SecureString
@ Амит нет. Это ничего не сделает для любого потенциального потерянного объекта string с открытым текстовым паролем.
@MickyD Я не рассматривал какой-либо объект string, который был получен из txtPassword.Text, предположим, что такой исключительной строки может не быть, выполнения txtPassword.Text = string.Empty будет недостаточно для перезаписи исходного значения его из его ссылки (памяти)
@Amit нет гарантии, что память будет очищена, если вы вызовете GC
И что ты после этого делаешь с этим паролем?
@Amit, вы можете назначить .Text все, что захотите. Пароль все еще может быть в памяти где-то незащищенным
Возможный дубликат Как правильно освободить память в C#
Не уверен, почему вы проголосовали за то, чтобы закрыть свой вопрос собственный как дубликат. Связанный пост не особо актуален
Возможно, не по теме - Возможный дубликат Лучший способ защитить страницу Winform?. Предлагается не использовать пароль вообще и использовать проверку подлинности Windows. Посмотрите комментарий Ганса Пассанта на этой странице





Думаю, вас заинтересует SecureString
An instance of the System.String class is both immutable and, when no longer needed, cannot be programmatically scheduled for garbage collection; that is, the instance is read-only after it is created, and it is not possible to predict when the instance will be deleted from computer memory. Because System.String instances are immutable, operations that appear to modify an existing instance actually create a copy of it to manipulate. Consequently, if a String object contains sensitive information such as a password, credit card number, or personal data, there is a risk the information could be revealed after it is used because your application cannot delete the data from computer memory.
A SecureString object is similar to a String object in that it has a text value. However, the value of a SecureString object is pinned in memory, may use a protection mechanism, such as encryption, provided by the underlying operating system, can be modified until your application marks it as read-only, and can be deleted from computer memory either by your application calling the Dispose method or by the .NET Framework garbage collector.
Я передаю строку данных и после нее в SecureString, но мне нужно уничтожить TextBox с помощью пароля и перехода String Variable в память.
Недостаточный. WinForms (предмет вопроса OP) не поддерживает SecureString для свойства Text или аналогичного, в отличие от PasswordBox WPF. PasswordBox даже не имеет свойства string Text, вместо этого это SecureString SecurePassword. Это создает основу для безопасных строк, подходящих для паролей. Попытка использовать SecureString для WinForms в качестве второстепенного шага рискованна.
@ daniele3004 - перенос данных с string на SecureString бесполезен (потому что string все еще находится в памяти, и вы не избавитесь от него так легко; вот в чем, по сути, ваш вопрос). Безопасность SecureString достигается только с помощью никогда не иметь "полного" string в (небезопасной) памяти. Вы добавляете его символ за символом, нажатие клавиши за нажатием. Как в примере в связанной статье MSDN.
Установите его в:
txtPassword.PasswordChar = '\0';
Пожалуйста, добавьте (краткое) объяснение. Насколько я понимаю, вы намереваетесь переписать строку, чтобы она больше не содержала текста и больше не содержала пароль. Не могли бы вы развить свой ответ?
Прагматически обзвон
GC- вещь не очень хорошая.