PasswordBox.Password属性不显示密码吗?

时间:2015-09-24 00:16:22

标签: wpf passwordbox

PasswordBox.Password上的msdn documentation说:

  

获取Password属性值时,将密码作为纯文本显示在内存中。要避免这种潜在的安全风险,请使用SecurePassword属性将密码作为SecureString获取。

所以我将SecurePassword发送到PasswordChanged事件的视图模型,希望一切都安全,但如果我用Snoop检查我的应用程序,在PasswordBox的Password属性中我会看到密码我输入了纯文本。这不会破坏使用SecurePassword的全部目的吗?我还应该做些什么来保护密码吗?

1 个答案:

答案 0 :(得分:6)

这是我的拙见。

Snoop在运行的应用程序中注入其代码。所以,它基本上是一个黑客工具。一个非常易于使用的黑客工具,仅适用于您的GUI。 这就是为什么简单地改变任何项目的可见性以隐藏来自用户的一些数据的原因是一个较差的安全性。关于限制,访问和安全性的一切都不应该在UI层处理。 How to Snoop proof your wpf application?有一些方法,但主要的答案是你必须设计你的应用程序,这不允许窥探违反任何东西。例如,验证服务器上的所有内容。

回到你的问题:

有两种情况。第一个是:用户创建密码。如果用户或用户的恶意软件此时会看到密码,我认为这不是问题。然后你收到并存储安全字符串。并清除用户的密码。

第二种情况:您向用户显示存储的密码。诀窍是 - 你不显示它。您知道密码的长度,因此您可以使用****显示刚刚禁用的文本框。如果用户想要更改密码 - 你给他实际的密码箱,他必须填写旧密码和新密码,我们回到方案#1。

一线希望是:

当用户输入密码时,它并不是什么大不了的事,因为用户知道他输入了什么,恶意软件可以跟踪按下的按键。 / p>

在您存储密码后,永远不会将其交还给用户

更新:这是密码框的密码属性的源代码

   public string Password
        {
            [SecurityCritical]
            get
            {
                string password;

                using (SecureString securePassword = this.SecurePassword)
                {
                    IntPtr ptr = System.Runtime.InteropServices.Marshal.SecureStringToBSTR(securePassword);

                    try
                    {
                        unsafe
                        {
                            password = new string((char*)ptr);
                        }
                    }
                    finally
                    {
                        System.Runtime.InteropServices.Marshal.ZeroFreeBSTR(ptr);
                    }
                }

                return password;
            }

所以,我想MSDN所说的是,无论何时访问Password属性,通过在代码中调用它(或在调试时在VS中查看它,或者将其视为Snoop),你都可以调用它的get方法,它将SecuredString解密为纯文本,将其暴露给内存。如果您不通过软件工具调用密码属性并且不通过软件工具调用它,则密码不会以纯文本形式显示在内存中。