gpt4 book ai didi

c# - MemoryStream 到 SecureString : Wiping the memory

转载 作者:太空狗 更新时间:2023-10-29 20:33:33 25 4
gpt4 key购买 nike

我正在从 MemoryStream 中检索一个未加密 key ,将其转换为某种字符串,然后将该字符串与 .Net 的 crypto 一起使用加密数据的函数。我需要确保 unencrypted key 在使用后从内存中删除。我找到了 SecureString,我认为它会处理字符串,但我不确定如何在 key 变成 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, 0, byKey.Length );
}

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

关于c# - MemoryStream 到 SecureString : Wiping the memory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30788666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com