我的密码存储在StringBuilder
对象中。我正在寻找一种方法来擦除内存中的密码。以下任何一种方法都可以实现这一目标:
'\0'
。是
如果我已分配,这保证使用相同的内存
最初有足够的记忆吗?ZeroMemory()
或SecureZeroMemory()
与StringBuilder
?任何代码示例?编辑:
使用SecureString
对我来说不是一个选项,因为我打电话给CredUIPromptForCredentials()
来获取凭据。
答案 0 :(得分:25)
简单的答案是,您提出的方法都不安全。一旦你将密码输入StringBuilder
,就会结束游戏。如果您必须使用托管类,请不要使用StringBuilder
来存储密码,而是使用SecureString
。
现在,您在评论中说您正在呼叫CredUIPromptForCredentials
。这样做,但不要将密码放入StringBuilder
。将它放入非托管内存中,例如分配给Marshal.AllocHGlobal
。然后,当您完成该非托管内存时,请执行CredUIPromptForCredentials
的文档说明并在释放非托管内存之前调用SecureZeroMemory
。
我注意到pinvoke.net转换使用StringBuilder
作为密码参数。也许这就是让你误入歧途的原因。你不需要这样做(你不应该这样做)。声明参数的类型为IntPtr
。