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