c# - 如何用零删除 StringBuilder 内存

标签 c# security stringbuilder

我在 StringBuilder 对象中存储了一个密码。我正在寻找一种方法来删除内存中的密码。以下任何一种方法都可以实现这一点:

  1. 遍历 StringBuilder 字符并分配 '\0'。是 如果我已经分配,​​这保证使用相同的内存 最初有足够的内存吗?
  2. 我可以使用任何非托管 API,例如 ZeroMemory()SecureZeroMemory() 使用 StringBuilder?有代码示例吗?

编辑:

使用 SecureString 不是我的选择,因为我正在调用 CredUIPromptForCredentials() 来获取凭据。

最佳答案

简单的答案是,您提出的所有方法都不安全。一旦您将密码输入 StringBuilder,游戏就结束了。不要使用 StringBuilder 来存储密码,如果您必须使用托管类,请改用 SecureString

现在,您在评论中说您正在调用 CredUIPromptForCredentials。这样做,但不要将密码放入 StringBuilder 中。将其放入非托管内存中,例如使用 Marshal.AllocHGlobal 分配。然后,当您使用完该非托管内存后,按照 CredUIPromptForCredentials 的文档进行操作说和打电话SecureZeroMemory在释放非托管内存之前。

我注意到 pinvoke.net翻译使用 StringBuilder 作为密码参数。也许这就是让你误入歧途的原因。你不需要那样做(你不应该那样做)。将参数声明为 IntPtr 类型。

关于c# - 如何用零删除 StringBuilder 内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20357196/

相关文章:

java - 什么是比较 StringBuilder 对象的有效方法

java - StringBuilder初始容量 "smart"的现有解决方案

c# - 根据字符串选择文件

c# - 复杂的 post 参数始终为 null

api - 适用于移动和网络的安全API

php - 用户可以在浏览器开发工具中操作选择框值吗

c# - 如何在 C# 中的二维数组中获取内部数组的长度?

c# - 将 null 添加到 List<bool?> 作为 IList 抛出异常

linux - 在每个用户的主目录中创建一个私有(private)文件夹

c# - String Concatenation 在 C# 中不安全,需要使用 StringBuilder?