我的应用程序要求用户输入如下密码:
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
字段,它在相当长的一段时间内保持密码。
显然,PasswordField.Text
只是一个常规的未加密字符串,这意味着用户的密码是公开的。(据我所知)真的没有办法解决这个问题,所以这是一个必要的邪恶。因此,我希望密码暴露的时间尽可能短。
实现这一目标的最佳方式是什么?密码表单会在我完成后立即处理,但这真的会从内存中删除所有"明文出现"的密码吗?如果没有,确保这种情况尽快发生的最佳方法是什么?
我相信这里已经回答了这个问题,但让我总结一下我的理解:
- SecureString的用例是防止开发人员在日志或崩溃报告中意外地向某人显示密码
- 如果你担心病毒从内存中窃取你的密码,那么加密它也无济于事,因为在某个时候你需要对它进行解密(如这里所解释的),这时病毒就可以获得密码
- 你可以创建一个像这样的自定义控件,它使用SecureString作为文本框,但我想问这有什么意义。除非你通过在内存中转储所有内容来创建日志条目或崩溃报告,否则可能没有意义