Hashing eines SecureString in .NET
In .NET haben wir die SecureString-Klasse, die sehr gut funktioniert, bis Sie versuchen, sie zu verwenden. Um beispielsweise die Zeichenfolge zu hashen, benötigen Sie den Klartext. Ich habe hier versucht, eine Funktion zu schreiben, die einen SecureString hasht, und zwar mit einer Hash-Funktion, die ein Byte-Array annimmt und ein Byte-Array ausgibt.
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;
}
Ich glaube, dass dies den String korrekt hasht und alle Kopien des Klartexts zum Zeitpunkt der Rückkehr der Funktion korrekt aus dem Speicher entfernt, vorausgesetzt, die bereitgestellte Hash-Funktion verhält sich gut und erstellt keine Kopien der Eingabe, die sie nicht enthält schrubben sich. Habe ich hier etwas verpasst?