如何用零擦除StringBuilder内存

has*_*mit 10 c# security stringbuilder

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

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

编辑:

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

Dav*_*nan 25

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

现在,你在评论中说你正在打电话CredUIPromptForCredentials.这样做,但不要把密码放入StringBuilder.把它放入非托管内存,例如分配Marshal.AllocHGlobal.然后,当您完成非托管内存时,在释放非托管内存之前,执行文档CredUIPromptForCredentials说和调用SecureZeroMemory.

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

  • @ It'sNotALie.嗯,这就是安全性的方式.安全始终涉及交易便利性. (11认同)
  • 但没有人说你需要把它放在`StringBuilder`中.例如,使用`Marshal.AllocHGlobal`分配非托管内存.然后,当您完成非托管内存时,请执行`CredUIPromptForCredentials`的文档,并在非托管内存上调用`SecureZeroMemory`. (3认同)