如何用零擦除StringBuilder内存

时间:2013-12-03 16:59:35

标签: c# security stringbuilder

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

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

    使用SecureString对我来说不是一个选项,因为我打电话给CredUIPromptForCredentials()来获取凭据。

1 个答案:

答案 0 :(得分:25)

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

现在,您在评论中说您正在呼叫CredUIPromptForCredentials。这样做,但不要将密码放入StringBuilder。将它放入非托管内存中,例如分配给Marshal.AllocHGlobal。然后,当您完成该非托管内存时,请执行CredUIPromptForCredentials的文档说明并在释放非托管内存之前调用SecureZeroMemory

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