9

上的msdn 文档PasswordBox.Password说:

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

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

4

1 回答 1

6

这是我的拙见。

Snoop 将其代码注入到正在运行的应用程序中。所以,它基本上是一个黑客工具。一个非常易于使用的黑客工具,仅适用于您的 GUI。这就是为什么简单地改变任何项目的可见性以向用户隐藏一些数据是一个糟糕的安全决定。所有关于限制、访问和安全的事情都不应该在 UI 层处理。有关于如何窥探证明您的 wpf 应用程序的方法?但答案的要点是你必须以这种方式设计你的应用程序,这不允许窥探违反任何事情。例如,验证服务器上的所有内容。

回到你的问题:

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

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

一线希望是:

当用户输入密码时,这没什么大不了的,它以明文形式存在于内存中的某个地方,因为用户知道他输入了什么,并且恶意软件可以跟踪按下的键。

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


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

   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 属性并且不通过在软件工具中检查来调用它,则密码不会以纯文本形式显示在内存中。

于 2015-09-24T10:59:26.513 回答