Например, нужно захешировать пароль методом string CalculateHash(string source). Но если я вытяну значение строки с SecureString в виде экземпляра класса string и передам его как атрибут, то эта строка попадёт в пул иинтернирования и будет лежать в памяти в открытом виде. Как бы правильно передать SecureString в метод CalculateHash, чтобы значение строки не осталось в памяти? Может можно каким-то образом использовать unsafe метод, который потом найдёт эту строку в адрессном пространстве приложения и затрёт её?
В вашем случае никак. У вас должен быть отдельный метод специально для такого сценария. Например: CalculateHash(SecureString source) или CalculateHash(IEnumerable<char> source)
Вот статья. Мне помогло.
Для ленивых:
String SecureStringToString(SecureString value) {
IntPtr valuePtr = IntPtr.Zero;
try {
valuePtr = Marshal.SecureStringToGlobalAllocUnicode(value);
return Marshal.PtrToStringUni(valuePtr);
} finally {
Marshal.ZeroFreeGlobalAllocUnicode(valuePtr);
}
}
и
void HandleSecureString(SecureString value) {
IntPtr valuePtr = IntPtr.Zero;
try {
valuePtr = Marshal.SecureStringToGlobalAllocUnicode(value);
for (int i=0; i < value.Length; i++) {
short unicodeChar = Marshal.ReadInt16(valuePtr, i*2);
// handle unicodeChar
}
} finally {
Marshal.ZeroFreeGlobalAllocUnicode(valuePtr);
}
}
Т. к. защищённых строк нет в Windows, эти строки не такие уж и защищённые. Но делать так не рекомендую (как минимум потому что это не CLS Api). Тут как с методом финализации: юзать только если уж очень надо. Либо работайте со string, либо с byte[], либо с char[], либо перейдите сюда
Продвижение своими сайтами как стратегия роста и независимости