【问题标题】:Setting the text of a PasswordBox设置 PasswordBox 的文本
【发布时间】:2015-08-31 03:46:43
【问题描述】:

我正在创建一个需要用户登录(用户名 + 密码)的应用程序。由于这是一个安全的应用程序,我使用 WPF 的 PasswordBox.SecurePassword 来安全地创建密码哈希(使用 SHA512CryptoServiceProvider,来自自定义流的哈希)以用作 Rfc2898DeriveBytes 的密码。假设我有一个 AES-256-CBC 实现,它可以安全地检索和存储密钥+IV,所以这不是问题。
我目前正在实施一种方法,让用户能够存储他们的密码,这样他们就不必每次登录时都输入密码。到目前为止,我能够使用 AES 自定义实现安全地存储密码,并且我可以安全地读取密码(也就是说,无需将密码以纯文本形式完全放入内存中)。
我遇到的问题是当我尝试替换 PasswordBox 中的文本时。 PasswordBox.SecurePassword 是只读的,我尝试使用 PasswordBox.SecurePassword.AppendChar(someChar) 但字段/值仍然为空。我想 PasswordBox.SecurePassword 只返回一个副本 (SecureString.Copy()) 而不是原始变量 (looking at .NET source code confirms this)。
有什么方法可以实现我想要的,或者我需要创建一个自定义 WPF 控件吗?

【问题讨论】:

  • “因为这是一个安全的应用程序” - 如果有人可以读取您应用程序的内存,那么该人也可以安装键盘记录器。
  • @CodeCaster 我们强制使用带有防键盘记录器的防病毒软件来尝试缓解这种情况。

标签: c# wpf security securestring


【解决方案1】:

要在 WPF 中设置 PasswordBox 的文本,请使用以下代码:

PasswordBox1.Password = "yourpassword";

您不需要使用 SecurePassword 功能,只要您能够获取纯文本密码,您就可以使用 Password 功能设置它。正如您提到的 SecurePassword 函数是只读的,这是因为它以安全形式检索密码,它不允许您在 PasswordBox 中设置文本。 MSDN Documentation

如果您希望能够将安全密码放入 PasswordBox 中,您也可以使用此方法,但不能以纯文本形式输入,因为您实际上是在要求破解加密,但如果您有密钥,您可以对其进行解密,然后先进行解密,然后在 PasswordBox 中设置文本。

要以纯文本形式查看在 PasswordBox 中输入的密码,请使用以下代码:

PasswordBox1.Password;

【讨论】:

  • @farbord,我避免使用密码属性,因为我不能冒险使用纯文本密码。这就是为什么我需要一种能够将安全字符串附加到 SecurePassword 的方法。
  • 我假设您想将 SecurePassword 属性更改为您存储的属性,但是这样做没有意义吗?只需创建一个新变量并将安全密码存储在那里。然后将虚拟数据放入 PasswordBox 或禁用它。您是否尝试将 SecurePassword 属性更改为您存储的属性并使用原始密码更新 PasswordBox?如果是这种情况,那么您就违背了拥有安全密码的全部目的,因为密码将在内存中以纯文本形式存在。正如我在原始答案中所述。
【解决方案2】:

这算是解决了。
我们决定使用动画向用户展示他们不需要再次输入密码。
遗憾的是,您不能像使用普通 SecureString 那样以编程方式将字符添加到 SecurePassword 属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 2018-01-29
    • 2011-10-16
    • 2019-01-26
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多