加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – MemoryStream到SecureString:擦除内存

发布时间:2020-12-15 07:45:45 所属栏目:百科 来源:网络整理
导读:我正在从MemoryStream中检索未加密的密钥,将其转换为某种字符串,并使用该字符串和.Net的加密函数来加密数据.我需要确保在使用后从内存中擦除未加密的密钥.我发现SecureString,我认为它会处理字符串,但我不确定如何在密钥成为SecureString之前擦除密钥的内存.
我正在从MemoryStream中检索未加密的密钥,将其转换为某种字符串,并使用该字符串和.Net的加密函数来加密数据.我需要确保在使用后从内存中擦除未加密的密钥.我发现SecureString,我认为它会处理字符串,但我不确定如何在密钥成为SecureString之前擦除密钥的内存.

所以一切工作的方式是:

MemoryStream -> char[] -> SecureString

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

SecureString(Char*,int32)

有一个实现它here的例子.

但是,一旦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,byKey.Length );
}

当然,这一切都假定代码不安全.但是,没有完全保证从内存中清除密钥的所有潜在实例的方法 – 在将密钥放入流中的调用期间,它可能被复制多次(在您无法访问的各种私有缓冲区中)所以你可能甚至都不知道徘徊的副本数量.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读