В .NET у нас есть класс SecureString, который очень хорошо, пока вы не попытаетесь его использовать, например (хэш-строку), вам нужен открытый текст. Я хотел бы здесь написать функцию, которая будет hash SecureString, учитывая хеш-функцию, которая принимает байтовый массив и выводит байтовый массив.
private static byte[] HashSecureString(SecureString ss, Func<byte[], byte[]> hash)
{
// Convert the SecureString to a BSTR
IntPtr bstr = Marshal.SecureStringToBSTR(ss);
// BSTR contains the length of the string in bytes in an
// Int32 stored in the 4 bytes prior to the BSTR pointer
int length = Marshal.ReadInt32(bstr, -4);
// Allocate a byte array to copy the string into
byte[] bytes = new byte[length];
// Copy the BSTR to the byte array
Marshal.Copy(bstr, bytes, 0, length);
// Immediately destroy the BSTR as we don't need it any more
Marshal.ZeroFreeBSTR(bstr);
// Hash the byte array
byte[] hashed = hash(bytes);
// Destroy the plaintext copy in the byte array
for (int i = 0; i < length; i++) { bytes[i] = 0; }
// Return the hash
return hashed;
}
Я полагаю, что это правильно приведет к хэшированию строки и будет корректно вычищать любые копии открытого текста из памяти к моменту возвращения функции, предполагая, что предоставленная хэш-функция хорошо себя ведет и не делает никаких копий ввода, что она не сглаживает себя. Я что-то пропустил?