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