Как вы правильно поняли, и другие уже упоминали, нет смысла использовать SecureString для хранения конфиденциальных данных, которые поступают из формы ASP.NET, потому что эти данные уже присутствуют в памяти вобычный текст.
Однако существуют и другие сценарии, в которых рекомендуется использовать SecureString
, поскольку конфиденциальные данные создаются самой программой и не должны оставаться в памяти после завершения работы с ней.Например, создание сайта SharePoint программным путем или передача учетных данных для проверки подлинности из одной системы в другую.
В старые добрые времена было проще обеспечить минимальный срок службы конфиденциальных данных.Он может быть размещен в стеке и очищен, как только программа будет выполнена с его использованием:
char secret[512];
generate_secret(secret, sizeof(secret));
do_something_with(secret);
memset(secret, 0, sizeof(secret));
// Secret data is now gone.
Однако такой подход невозможен для управляемых строк, главным образом потому, что:
- Они не размещены в стеке,
- Они неизменны, поэтому их невозможно очистить,
- Они не подлежат утилизации, поэтому нет гарантии относительно времени, когдаGC освободит данные.Это может даже никогда не быть освобождено, в зависимости от условий памяти.
SecureString
пытается решить эту проблему, будучи изменяемым и одноразовым, что позволяет написать:
using (SecureString secret = new SecureString()) {
GenerateSecret(secret);
secret.MakeReadOnly();
DoSomethingWith(secret);
}
// Secret data is now gone.