密码是否会被PasswordBox.Password属性显示出来?

9
msdn文档中,关于PasswordBox.Password的说明如下:

当您获取Password属性值时,您会在内存中以明文形式公开密码。为避免这种潜在的安全风险,请使用SecurePassword属性将密码作为SecureString获取。

因此,我在PasswordChanged事件中向我的视图模型发送SecurePassword,希望一切都是安全的,但是如果我用Snoop检查我的应用程序,在PasswordBox的Password属性中,我看到了我输入的明文密码。这不是破坏使用SecurePassword的全部目的吗?在这里还有其他需要做的事情来保护密码吗?

那么,您的PasswordBox的哪个属性与视图模型绑定? - torvin
@torvin:我不绑定到PasswordBox。由于安全问题,它没有可绑定的密码属性,所以,正如我所说,我在代码后台处理PasswordChanged事件。我只需将DataContext强制转换为我的视图模型类型并更新其密码属性即可。 - Daria
您应该将PasswordBox.SecurePassword属性与视图模型中SecureString类型的属性绑定。这样它将受到内存扫描的安全保护(这就是SecureString的作用)。 - torvin
@torvin:我的视图模型的密码属性是SecureString类型。 - Daria
1个回答

6

这只是我的个人意见。

Snoop将其代码注入正在运行的应用程序中。因此,它基本上是一个黑客工具。这是一个非常易于使用的黑客工具,仅与您的GUI一起使用。 这就是为什么仅通过更改任何项目的可见性来隐藏某些数据以使其对用户不可见是一个较差的安全决策。关于限制、访问和安全性的所有内容都不应在UI层处理。有关如何防止Snoop破解您的wpf应用程序?的方法,但那里的主要答案是您必须以不允许snoop违反任何内容的方式设计应用程序。例如,在服务器上验证所有内容。

回到您的问题:

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

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

银色的衬里是:

当用户输入密码时,在内存中以明文形式存在并不是什么大问题,因为用户知道自己键入了什么,恶意软件可以跟踪按键。

在存储密码后,您永远不要将其返回给用户


更新:这是PasswordBox的Password属性的源代码

   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解密为明文,从而暴露它到内存中。如果您不调用Password属性并且不通过软件工具来检查它,则密码不会以明文形式显示在内存中。


1
这是否意味着对于恶意软件来说,窃取可视树或拦截按键要比从内存中嗅探密码字符串更加困难? - Daria
1
@Andikki,我不是开发恶意软件的专家,但是关于“被认为更加困难”的词语让我感到困惑。在PasswordBox中,微软已经确保密码不会以明文形式出现在内存中,除非您或其他人调用其密码属性。他们是否可以提供更多的保护?他们应该这样做吗? - netaholic
1
我对安全方面了解不多,所以我的问题可能很幼稚。但是我想确保我正确地实现了授权表单这样的常见元素。试图理解为什么应该采取预防措施,以避免将密码放入内存,同时又不必担心可访问的密码显示属性。我可以想象一种情况,用户向支持发送内存快照,而不知道他正在泄漏密码。我们在这里防范这种事情吗? - Daria

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接