gpt4 book ai didi

c# - 从内存中清除 C# 字符串

转载 作者:IT王子 更新时间:2023-10-28 23:29:37 25 4
gpt4 key购买 nike

出于安全原因,我正在尝试清除 C# 字符串的内存内容。我知道 SecureString 类,但不幸的是我不能在我的应用程序中使用 SecureString 而不是 String。需要清除的字符串是在运行时动态创建的(例如,我不想清除字符串文字)。

我发现的大多数搜索结果基本上都表明清除 String 的内容是不可能的(因为字符串是不可变的)并且应该使用 SecureString

因此,我确实在下面提出了自己的解决方案(使用不安全代码)。测试表明解决方案有效,但我仍然不确定解决方案是否有问题?还有更好的吗?

static unsafe bool clearString(string s, bool clearInternedString=false) 
{
if (clearInternedString || string.IsInterned(s) == null)
{
fixed (char* c = s)
{
for (int i = 0; i < s.Length; i++)
c[i] = '\0';
}
return true;
}
return false;
}

编辑:由于 GC 的注释在 clearString 被调用之前移动了字符串:下面的代码片段呢?

string s = new string('\0', len);
fixed (char* c = s)
{
// copy data from secure location to s
c[0] = ...;
c[1] = ...;
...

// do stuff with the string

// clear the string
for (int i = 0; i < s.Length; i++)
c[i] = '\0';
}

最佳答案

你的问题是字符串可以移动。如果 GC 运行,它可以将内容移动到新位置,但不会将旧位置归零。如果您确实将有问题的字符串清零,则无法保证它的副本不存在于内存中的其他地方。

这里是 link到 .NET 垃圾收集器,它谈到了压缩。

编辑:这是您的更新问题:

// do stuff with the string

问题在于,一旦它脱离您的控制,您就无法确保它是安全的。如果它完全在您的控制范围内,那么您将不会受到仅使用字符串类型的限制。简单地说,这个问题已经存在很长时间了,没有人想出一个安全的方法来处理这个问题。如果你想保证它的安全,最好通过其他方式来处理。清除字符串是为了防止有人通过内存转储找到它。如果您不能使用安全字符串,阻止这种情况的最佳方法是限制对运行代码的机器的访问。

关于c# - 从内存中清除 C# 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32256138/

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