Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 绑定密码箱密码是个坏主意吗?_C#_Wpf_Security_Data Binding_Mvvm - Fatal编程技术网

C# 绑定密码箱密码是个坏主意吗?

C# 绑定密码箱密码是个坏主意吗?,c#,wpf,security,data-binding,mvvm,C#,Wpf,Security,Data Binding,Mvvm,我已经了解到,出于安全原因,WPF密码框中的密码没有用于绑定密码的依赖项属性。尽管如此,还是有一些问题 MVVM模式的用户需要这种数据绑定;viewmodel无法在不破坏模式的情况下直接触摸密码框。在MVVM设置中使用密码框的一种方法是将其绑定到ViewModel,但这会破坏模式。绑定密码可能是使用MVVM处理密码最干净的方法 有一个错误,因为这会将明文密码保留在未加密的内存中,直到它被垃圾回收。然而,在我看来,密码从您访问password属性的那一刻起就存储在未加密的内存中。这一观点(或类似观

我已经了解到,出于安全原因,WPF密码框中的密码没有用于绑定密码的依赖项属性。尽管如此,还是有一些问题

MVVM模式的用户需要这种数据绑定;viewmodel无法在不破坏模式的情况下直接触摸密码框。在MVVM设置中使用密码框的一种方法是将其绑定到ViewModel,但这会破坏模式。绑定密码可能是使用MVVM处理密码最干净的方法

有一个错误,因为这会将明文密码保留在未加密的内存中,直到它被垃圾回收。然而,在我看来,密码从您访问
password
属性的那一刻起就存储在未加密的内存中。这一观点(或类似观点)似乎得到了支持。当然,在没有绑定的情况下,它会在内存中保留较短的时间(并不是说登录表单有长寿的趋势),但风险仍然存在


考虑到这些参数,绑定密码真的是个坏主意吗?为什么呢?

使用WPF Inspector或Snoop等工具,您可以监视密码字符串。将PasswordBox传递到视图模型的另一种方法是将行为对象附加到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
        }
    }
}
公共密封类PasswordBoxBehavior:Behavior
{
受保护的覆盖无效附加()
{
base.onatached();
AssociatedObject.LostKeyboardFocus+=AssociatedObjectLostKeyboardFocus;
}
附加时受保护的覆盖无效()
{
AssociatedObject.LostKeyboardFocus-=AssociatedObjectLostKeyboardFocus;
base.OnDetaching();
}
无效关联的ObjectLostKeyboardFocus(对象发送器,KeyboardFocusChangedEventArgs e)
{
var associatedPasswordBox=作为PasswordBox的AssociatedObject;
if(associatedPasswordBox!=null)
{
//在此处设置视图模型的密码属性
}
}
}
以及XAML代码:

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

...
...

不绑定密码框认为窥探它不会产生结果是不明智的

Passwordbox.Password将始终显示密码,无论发生什么情况]


您是否考虑绑定到密码属性的吸气剂?它保持了mvvm模式的完整性,这是什么意思?什么能手?+1:有趣的问题。我担心的是,未加密的密码可能会无限期地保留在内存中,即使它们保存在短期变量中。NET在垃圾收集期间不会清除回收的内存。因此,除非您在整个实现过程中使用
SecureString
(直到密码散列的计算),否则我认为维护这种安全级别没有什么好处,只需使用第一个链接中建议的附加属性。@Gigi,密码的获取者property@Zwirbelbart一种有价值的“微观优化“。也许我的应用程序响应SSL ping,然后Heartbleed bug让坏人读取它的部分内存,但对它读取的内容没有太多控制。很高兴知道我不会有不必要的密码字符串浮动。你是对的,如果密码被绑定,确实可以窥探密码。对我来说,这意味着答案肯定是:是的,绑定密码是一个非常糟糕的主意。你也可以窥探PasswordBox的Password属性。不绑定它并不能解决问题…IDEA是避免使用Password属性作为密码。最好使用无法窥探的SecurePassword属性。