Как стереть память StringBuilder с нуля

У меня есть пароль, хранящийся в объекте StringBuilder. Я ищу способ стереть пароль в памяти. Достигнет ли какой-либо из следующих способов:

  • Перебирайте символы StringBuilder и назначьте '\0'. Является это гарантировало использование той же памяти, если я выделил достаточная память изначально?
  • Можно ли использовать любой неуправляемый API, например ZeroMemory() или SecureZeroMemory() с StringBuilder? Любые примеры кода?

EDIT:

Использование SecureString для меня не является вариантом, так как я вызываю CredUIPromptForCredentials() для получения учетных данных.

Ответ 1

Простой ответ заключается в том, что ни один из методов, которые вы предлагаете, не защищен. И как только вы вводите пароль в StringBuilder, игра заканчивается. Не используйте StringBuilder для хранения пароля, вместо этого используйте SecureString, если вам нужно использовать управляемый класс.

Теперь вы говорите в комментариях, что вы вызываете CredUIPromptForCredentials. Так что сделайте это, но не вводите пароль в StringBuilder. Поместите его в неуправляемую память, например, выделенную с помощью Marshal.AllocHGlobal. Затем, когда вы закончите с этой неуправляемой памятью, сделайте то, что говорят docs для CredUIPromptForCredentials и вызывайте SecureZeroMemory, прежде чем освободить неуправляемую память.

Я отмечаю, что pinvoke.net использует StringBuilder для параметра пароля. Возможно, это и привело вас в заблуждение. Вам не нужно это делать (вы не должны этого делать). Объявите параметр вместо типа IntPtr.