确保从内存中删除敏感数据

时间:2015-06-24 23:39:42

标签: c# winforms

我的应用程序要求用户输入如下密码:

subject.getStudent()

using (var passwordForm = new PasswordForm()) { var result = passwordForm.ShowDialog(); if (result == DialogResult.OK) { password = new SecureString(); foreach(var c in passwordForm.PasswordBox.Text) { password.AppendChar(c); } } } 是一个password字段,可以保留密码很长一段时间。

显然,SecureString只是一个常规的未加密字符串,这意味着会泄露用户的密码。实际上没有办法解决这个问题(据我所知),所以这是一个必要的邪恶。因此,我希望密码暴露的时间段尽可能短。

实现这一目标的最佳方法是什么?密码表单将在我完成后立即处理,但这实际上是否会从内存中删除密码的所有“明文出现”?如果没有,那么确保尽快实现这一目标的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

我相信这已经回答了here,但让我总结一下我的理解:

  • SecureString的用例是防止开发人员意外地向日志或崩溃报告中的某人显示密码。
  • 如果您担心病毒会将密码从内存中窃取,甚至加密也无济于事,因为在某些时候您需要对其进行解密(如here所解释的那样),此时病毒可以获得密码。
  • 您可以创建一个像one这样的自定义控件,它使用SecureString作为文本框,但我会质疑这一点。除非您通过将所有内容转储到内存中来创建日志条目或崩溃报告,否则可能没有意义。