MemoryStream到SecureString:擦除内存

don*_*lan 7 c#

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

所以一切正常的方式是:

MemoryStream - > char [] - > SecureString

SecureString传递指向char数组的指针,所以它在完成后擦除char数组?这是它的构造函数:

SecureString(Char*,int32)
Run Code Online (Sandbox Code Playgroud)

有实现它的例子在这里.

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

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

如何MemoryStream直接阅读a char[]而不在内存中产生任何其他东西?(如果那是不可能的,那么理想的过渡是什么?即,MemoryStream -> string -> char[]?)

和,

完成后如何覆盖MemoryStream(和MemStream->char[]过程中创建的任何其他签名)使用的内存?

xxb*_*bcc 2

首先,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 );
}
Run Code Online (Sandbox Code Playgroud)

当然,这一切都假设有unsafe代码。然而,没有完全保证的方法可以从内存中清除密钥的所有潜在实例 - 在调用将密钥放入流中时,它可能会被复制多次(在您无权访问的各种私有缓冲区中),因此您可能甚至不知道有多少份副本存在。