【问题标题】:Safety benefits of the Password in WPF PasswordBox not being bindable?WPF PasswordBox 中密码的安全优势不可绑定?
【发布时间】:2014-04-26 00:57:33
【问题描述】:

我刚刚偶然发现 WPF PasswordBoxes 的 Password 属性出于安全原因不可绑定,这使得在 MVVM 上下文中使用它们非常麻烦。 像https://stackoverflow.com/a/1493330/3198247 这样的答案表明,否则,密码可能会在运行时以纯文本形式存储在内存中,这是一个坏主意,因为它可能会被恶意软件读取。

但是,我似乎仍然不明白一般原因或答案。在那里,它说将您的密码以纯文本形式保存在客户端计算机 RAM 上是安全禁忌。。但是,密码一输入就在内存中,因为我可以从代码中访问它。 那么为什么恶意软件不能直接从文本框中读取呢?我在这里错过了另一点吗?

编辑:澄清,特别是。关于 Sheridan 的回答:假设 PasswordBox 用户键入“pw”作为他的密码。然后,显然“pw”在内存中,因为我可以通过PasswordBox.Password 检索它。 为什么另外能够将它绑定到 ViewModel 的字符串属性是不安全的? 然后,“pw”最多包含在两个字符串中,但据我所知,这个不应使其或多或少安全。还是真的要“提醒”程序员不要将 PW 存储的时间超过需要的时间?

【问题讨论】:

  • PasswordBox.Password 绑定到字符串属性并不理想(就像首先使用它并不理想),但将PasswordBox.SecurePassword 绑定到SecureString 不应该损害安全性.
  • SecureString 根本无法防范恶意软件,它只会防止密码出现在交换文件和故障转储中。

标签: c# wpf passwords


【解决方案1】:

阅读此答案 Why is char[] preferred over String for passwords? 我知道它是 java,但我相信同样的规则适用。但根据您的系统所需的安全级别,这应该足够了。恶意软件总有办法获取信息,例如键盘记录,但你能做的只有这么多。

【讨论】:

【解决方案2】:

缺少一些东西。

纯密码应该从不存储在数据库中。相反,密码被加密并然后存储在数据库中。当用户尝试登录时,他们会键入他们的文本您应该立即对其进行加密与数据库中的加密密码进行比较

因此,无论是在数据库中,还是代码中,我们都不会看到未加密的密码。

【讨论】:

  • 我不是在谈论数据库或那里的密码存储。我实际上指的是从输入框中获取密码的位置/之前。显然,此时密码需要在内存中,因为如果没有明文,我无法对其进行加密。重点真的只是a)太烦人了,它基本上迫使程序员寻找丑陋的解决方法(参见这种情况下的许多绑定帮助程序类)或b)通过使密码尽可能短地以明文形式使用它们需要时主动取回?
  • 我们不是在谈论数据库 - 我们在谈论 RAM。
  • 当您只需要使用密码来验证用户登录时,您不应该对数据库中的密码进行加密,您应该使用适当的密码哈希(bcrypt、scrypt、PBKDF2)对其进行哈希处理。您可以对哈希值进行加密或添加,但这并不能为您带来太多好处,因为可以窃取数据库的攻击者很可能也可以窃取密钥(除非您使用的是 HSM)。
  • 这并没有任何帮助。 WPF PasswordBox 控件以纯文本形式存储密码,这并不是 Sheridan 解释的“正确”方式。真的,在我能想到的代码中根本看不到未加密/未散列的密码,因为用户必须能够输入它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-19
  • 2014-08-23
  • 2017-04-20
  • 1970-01-01
  • 2014-02-09
  • 1970-01-01
  • 2017-10-04
相关资源
最近更新 更多