绑定PasswordBox密码是个坏主意吗?

时间:2014-04-12 14:18:16

标签: c# wpf security data-binding mvvm

我已经读过WPF PasswordBox中的密码没有用于绑定密码的依赖项属性,出于安全原因。尽管如此,仍有ways to bind it anyway

MVVM模式的用户需要此数据绑定; viewmodel无法在不破坏模式的情况下直接触摸PasswordBox。在MVVM设置中使用PasswordBox的一种方法是pass the entire PasswordBox control到ViewModel,但这无论如何都会破坏模式。绑定密码可能是使用MVVM处理密码的最简洁方法。

有一个argument against binding the Password,因为这会将明文密码保存在未加密的内存中,直到它被垃圾收集。然而,我看到它的方式是,从您访问Password属性的那一刻起,密码就会存储在未加密的内存中。这个观点(或类似的)似乎在this question中被借调。当然,它会在更短的时间内没有约束(不是登录形式有长期存在的倾向),但风险仍然存在。

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

2 个答案:

答案 0 :(得分:5)

使用WPF Inspector或Snoop等工具可以侦察密码字符串。将PasswordBox传递给视图模型的替代方法是附加行为< UIElement>对象密码盒对象,如下所示:

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 :(得分:1)

不绑定密码框以为窥探它不会产生结果,这是不明智的!!

Passwordbox。无论如何![enter image description here] 1

,Password仍会显示密码

enter image description here