MemoryStream到SecureString:擦除内存

我从MemoryStream检索unencrypted密钥,将其转换为某种字符串,然后将该字符串与.Net的crypto函数一起使用来加密数据。 我需要确保在使用后unencrypted密钥从内存中被擦除。 我发现SecureString ,我认为它会照顾字符串,但我不确定如何在密钥变成SecureString之前擦除密钥的内存。

所以一切正常的方式是:

MemoryStream - > char [] - > SecureString

SecureString将指针传递给char数组,因此它在完成时擦除char数组? 这是它的构造函数:

SecureString(Char*,int32)

这里有一个实现它的例子。

但是,一旦SecureString擦除数据(如果擦除数据),我仍然需要知道如何擦除MemoryStream的数据以及为了获取char[]必须创建的任何中间对象。

所以这个问题归结为两个部分:

如何将MemoryStream直接读入char[]而不在内存中产生其他内容? (如果这是不可能的,理想的转换是什么?即, MemoryStream -> string -> char[] ?)

和,

如何覆盖MemoryStream使用的内存(以及在MemStream->char[]进程中创建的任何其他签名)?


首先, SecureString不会擦除输入char*的内存 - - 您应对此负责。 它只会清理自己的内部存储空间。

要将MemoryStream的内容读取/清除为本地char[] ,您可以简单地分配数组(假设您的流包含有效的字符串):

// Get the contents of the stream.
var byKey = oMS.GetBuffer ();

fixed ( byte *pBytes = byKey )
{
    var oSecStr = new SecureString ( (char*) pBytes, 
        (int) ( oMS.Length / 2 ) );

    // Clear stream (there's no separate char/byte array
    // to clean).
    Array.Clear ( byKey, 0, byKey.Length );
}

当然,这一切都假定unsafe代码。 但是,并没有完全保证从内存中清除密钥的所有可能实例 - 在将密钥加入流中的调用期间,可能会复制很多次(在您无法访问的各种私有缓冲区中),所以你可能甚至不知道周围的副本数量。


你所尝试的是比你想象的更麻烦的问题。 MemoryStream最有可能被别的东西使用,并且随着时间的推移,最有可能会增长。

每次增长时,数据都会被内部复制到一个新数组中,旧数据将被释放=>您的密钥可能会泄漏到此处

此外,一个MemoryStream最有可能被其他一些API使用。 其他API很可能不会安全地删除密钥,因为它们不是为了这样做而设计的。

但要回答您的原始问题:如果密钥只是ascii字符,您可以将字节复制到char数组中,并用随机垃圾覆盖原始字节。 您可以直接使用GetBuffer其内容。

链接地址: http://www.djcxy.com/p/27007.html

上一篇: MemoryStream to SecureString: Wiping the memory

下一篇: Mocha watch doesnt trigger on new files