我在 StringBuilder
对象中存储了一个密码。我正在寻找一种方法来删除内存中的密码。以下任何一种方法都可以实现这一点:
- 遍历 StringBuilder 字符并分配
'\0'
。是 如果我已经分配,这保证使用相同的内存 最初有足够的内存吗? - 我可以使用任何非托管 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/