Неплохая идея связать пароль PasswordBox?

Я читал, что пароль в WPF PasswordBox не имеет свойства зависимости для привязки пароля по соображениям безопасности. Несмотря на это, есть способы связать его в любом случае.

Пользователям шаблона MVVM требуется эта привязка данных; viewmodel не может коснуться PasswordBox напрямую, не нарушая шаблон. Один из способов работы с PasswordBoxes в настройке MVVM - передать весь элемент управления PasswordBox в ViewModel, но это все равно нарушает шаблон. Связывание пароля, вероятно, является самым чистым способом работы с паролями с использованием MVVM.

Существует аргумент против привязки пароля, поскольку он будет хранить пароль незашифрованного текста в незашифрованной памяти, пока не будет получен сбор мусора. Тем не менее, я вижу, что пароль все равно сохраняется в незашифрованной памяти с момента доступа к свойству Password. Этот взгляд (или аналогичный), кажется, откомандирован в этот вопрос. Конечно, это будет в памяти в течение более короткого периода без привязки (не в том, что формы входа имеют тенденцию быть долгоживущими в любом случае), но риск все еще существует.

Учитывая эти аргументы, действительно ли плохая идея связать пароль? И почему?

Ответ 1

Используя такие инструменты, как 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 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>