c# wpf security data-binding mvvm

c# - ¿Es una mala idea vincular la contraseña de PasswordBox?



passwordbox wpf text (1)

Usando herramientas como WPF Inspector o Snoop puedes espiar la cadena de contraseña. Una alternativa para pasar el PasswordBox al view-model es adjuntar un objeto Behavior <UIElement> a su objeto PasswordBox como se muestra a continuación:

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 } } }

y el código XAML:

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

He leído que la contraseña en un WPF PasswordBox no tiene una propiedad de dependencia para enlazar la contraseña por razones de seguridad . A pesar de esto, hay formas de unirlo de todos modos .

Los usuarios del patrón MVVM requieren este enlace de datos; el modelo de vista no puede tocar el PasswordBox directamente sin romper el patrón. Una forma de trabajar con PasswordBoxes en una configuración MVVM es pasar todo el control PasswordBox al ViewModel, pero esto rompe el patrón de todos modos. La vinculación de la contraseña es probablemente la forma más limpia de trabajar con contraseñas usando MVVM.

Existe un argumento en contra de vincular la Contraseña, ya que esto mantendría la contraseña de texto sin formato en la memoria no encriptada hasta que se recolecte la basura. La forma en que lo veo, sin embargo, es que la contraseña se almacena en la memoria no encriptada de todos modos desde el momento en que accede a la propiedad Password . Esta vista (o similar) parece estar secundada en esta pregunta . Por supuesto, estaría en la memoria por un período más corto sin ser vinculante (no es que los formularios de inicio de sesión tengan una tendencia a ser de larga duración de todos modos), pero el riesgo sigue ahí.

Dados estos argumentos, ¿es realmente una mala idea vincular la contraseña? ¿Y por qué?