所以一切工作的方式是:
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 );}
当然,这一切都假定代码不安全.但是,没有完全保证从内存中清除密钥的所有潜在实例的方法 – 在将密钥放入流中的调用期间,它可能被复制多次(在您无法访问的各种私有缓冲区中)所以你可能甚至都不知道徘徊的副本数量.
总结以上是内存溢出为你收集整理的c# – MemoryStream到SecureString:擦除内存全部内容,希望文章能够帮你解决c# – MemoryStream到SecureString:擦除内存所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)