Нет, это не только для записи: вы можете извлечь обычный .NET String
из SecureString
, используя класс Marshal :
IntPtr ptr = Marshal.SecureStringToBSTR(secureString);
string str = Marshal.PtrToStringBSTR(ptr);
Marshal.ZeroFreeBSTR(ptr);
return str;
Обратите внимание, что этовыделяет неуправляемую память, поэтому вам необходимо обязательно ее освободить (с Marshal.ZeroFreeBSTR
), чтобы избежать утечек.И само собой разумеется, что после того, как вы конвертируете его в строку .NET, вы теряете преимущества SecureString (строка останется в памяти до тех пор, пока не будет скопирована на GC, она может быть перенесена на диск и т. Д.).
Цель класса SecureString заключается в том, что вы можете использовать его в API, где должна быть защищена конфиденциальность пользовательских данных (например, паролей или номеров кредитных карт) (например, если ваше приложение дает сбой и мини-дамп сохраняется вдиск).Несколько классов в .NET Framework (например, PasswordBox.SecurePassword ) принимают объект SecureString, чтобы избежать раскрытия этих данных.