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?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage