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

标签 c# winforms

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

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 只是一个普通的未加密字符串,这意味着用户的密码被暴露了。没有真正解决这个问题的方法(据我所知)所以这是一个必要的邪恶。因此,我希望密码暴露的时间越短越好。

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

最佳答案

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

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

关于c# - 确保从内存中删除敏感数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31038929/

相关文章:

c# - 如何将指向从托管代码到非托管代码的结构的指针数组的指针编码(marshal)?

c# - 在aspx页面中访问方法变量背后的代码

c# - 使用linq和automapper在dto中将属性序列化为复杂类型

c# - ProductName 隐藏 System.Windows.Forms.Control.ProductName

.net - PropertyGrid 可以编辑任何旧的键值对列表吗?

c# - 在一个窗口中打开多个链接,然后在另一个窗口中打开多个链接

c# - .Net LINQ to SQL 异常

c# - MVVM 中的上下文菜单

c# - 将泛型添加到表单

c# - 自托管 SignalR 和访问控制允许来源