绑定PasswordBox密码是一个不好的想法吗?

13
我已经阅读到,WPF PasswordBox中的密码不具备绑定密码的依赖属性,这是出于安全原因。尽管如此,仍然有方法可以绑定它
MVVM模式的用户需要进行数据绑定;视图模型不能直接触及PasswordBox,否则会破坏该模式。在MVVM设置中处理PasswordBoxes的一种方法是将整个PasswordBox控件传递给ViewModel,但这样做仍然会破坏该模式。使用数据绑定来绑定密码可能是使用MVVM处理密码的最清洁方式。

有人反对将密码绑定argument against binding the Password,因为这会使明文密码保留在未加密的内存中,直到被垃圾回收。然而,我认为,从你访问Password属性的那一刻起,密码就已经以明文形式存储在未加密的内存中了。this question似乎也支持这种观点(或类似观点)。当然,如果不进行绑定,它在内存中的时间会更短(尽管登录表单本来就没有长寿命),但风险仍然存在。

鉴于这些论点,将密码绑定真的是一个坏主意吗?为什么?


你是否考虑绑定到 Password 属性的 getter 呢?这样可以保持 MVVM 模式的完整性。 - Gayot Fow
你是什么意思?什么getter? - Gigi
1
+1:有趣的问题。我的担忧是,未加密的密码即使保存在短暂的变量中,也可能无限期地保留在内存中;.NET在垃圾回收期间不会清除回收的内存。因此,除非您在整个实现过程中都使用SecureString(直到计算密码哈希值),否则我认为保持这种安全级别没有太大优势,并且只需使用您第一个链接中建议的附加属性即可。 - Douglas
1
@Zwirbelbart 是一种有价值的“微优化”。也许我的应用程序会响应SSL ping,然后Heartbleed漏洞让坏人从其内存的某个部分读取,但对于它所读取的内容没有太多控制。知道我没有不必要的密码字符串漂浮在周围会很好。 - Adrian Ratnapala
@Adrian Ratnapala 我认为考虑像心脏出血这样的攻击是非常夸张的。当涉及到存储在内存中的敏感数据时,我从未听说过这样的解释。在我看来,像心脏出血这样的事情似乎很不可能发生。但好吧,这当然是一个可以争论的观点。 - Zwirbelbart
显示剩余2条评论
2个回答

6

使用类似于 WPF Inspector 或 Snoop 的工具,您可以窥视密码字符串。将 PasswordBox 传递给视图模型的另一种方法是将 Behavior<UIElement> 对象附加到 PasswordBox 对象上,如下所示:

public sealed class PasswordBoxBehavior : Behavior<UIElement>
{
    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.LostKeyboardFocus += AssociatedObjectLostKeyboardFocus;
    }

    protected override void OnDetaching()
    {
        AssociatedObject.LostKeyboardFocus -= AssociatedObjectLostKeyboardFocus;
        base.OnDetaching();
    }

    void AssociatedObjectLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
    {
        var associatedPasswordBox = AssociatedObject as PasswordBox;
        if (associatedPasswordBox != null)
        {
            // Set your view-model's Password property here
        }
    }
}

还有XAML代码:

<Window ...
        xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity">
    ...
    <PasswordBox ....>
        <i:Interaction.Behaviors>
            <local:PasswordBoxBehavior />
        </i:Interaction.Behaviors>  
    </PasswordBox>
    ...
</Window>

1
你是对的 - 如果密码被绑定,那么窃取密码确实是可能的。对我来说,这意味着答案肯定是:是的,绑定密码是一个非常糟糕的想法。 - Gigi
1
你也可以窥视PasswordBox的Password属性。不绑定它并不能解决问题... - almulo
这个想法是避免使用 Password 属性来存储密码。最好使用 SecurePassword 属性,因为它无法被窥视。 - mca

2
不将密码框绑定,认为窥探它不会产生结果是不明智的想法!无论如何,Passwordbox.Password仍将显示密码。【注:图片链接已失效】

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