.NET には、SecureString クラスがあります。これは、(たとえば) 文字列をハッシュするためにプレーンテキストが必要なため、試して使用するまではすべて問題ありません。ここでは、バイト配列を取り、バイト配列を出力するハッシュ関数が与えられた場合に、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;
}
これにより、文字列が正しくハッシュされ、提供されたハッシュ関数が適切に動作し、入力のコピーを作成しないと仮定すると、関数が戻るまでにメモリから平文のコピーが正しくスクラブされると思います。スクラブ自体。ここで何か見逃しましたか?