2016-09-27 3 views
2

Есть ли способ сделать PasswordBox в приложении WPF работать так же, как в большинстве приложений для телефонов или планшетов. То есть, пусть он покажет последний символ, введенный открытым текстом на короткий период.Телефонный пароль для окна приложения WPF

ответ

2

Для этого не существует способа, так как он нарушает правила безопасности. Пожалуйста, смотрите эту должность для получения дополнительной информации о том, почему это не рекомендуется: How to bind to a PasswordBox in MVVM

Вот принятый ответ:

Люди должны иметь следующую директиву безопасности татуировку на внутренней стороне своих век: Никогда хранить в текстовом формате пароли.

Причина, по которой WPF/Silverlight PasswordBox не предоставляет DP для свойства Password, связана с безопасностью. Если WPF/Silverlight должны были хранить DP для пароля, для этого потребуется, чтобы фреймворк сохранял сам пароль незашифрованным в памяти. Это считается довольно сложным вектором атаки безопасности. В PasswordBox используется зашифрованная память (сортировка), и единственный способ доступа к паролю - это свойство CLR.

Если вы все еще хотите достичь этого, я смог сделать это с помощью элемента управления TextBox.

XAML:

<TextBox Name="tbPassword"/> 

Codebehind:

string actualPassword = ""; 
    string displayedPassword = ""; 
    DispatcherTimer dispatcherTimer = new DispatcherTimer(); 

    public MainWindow() 
    { 
    InitializeComponent(); 
    tbPassword.PreviewKeyDown += tbPassword_PreviewKeyDown; 
    tbPassword.PreviewTextInput += tbPassword_PreviewTextInput; 

    dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick); 
    dispatcherTimer.Interval = new TimeSpan(0, 0, 1); 
    } 

    private void tbPassword_PreviewKeyDown(object sender, KeyEventArgs e) 
    { 
    if (e.Key == Key.Back) 
    { 
     if (actualPassword.Length > 0) 
     { 
      actualPassword = actualPassword.Substring(0, actualPassword.Length - 1); 
      if (actualPassword.Length > 0) 
      { 
       ShowLastCharacter(); 
       tbPassword.CaretIndex = displayedPassword.Length; 
      } 
     } 
    } 
    } 

    private void tbPassword_PreviewTextInput(object sender, TextCompositionEventArgs e) 
    { 
    actualPassword += e.Text; 
    e.Handled = true; 
    ShowLastCharacter(); 
    tbPassword.CaretIndex = displayedPassword.Length; 
    } 


    private void ShowLastCharacter() 
    { 
    var lastChar = actualPassword.Substring(actualPassword.Length - 1); 
    displayedPassword = ""; 
    for (int i = 0; i < actualPassword.Length - 1; i++) 
     displayedPassword += "•"; 
    displayedPassword += lastChar; 
    tbPassword.Text = displayedPassword; 

    if (dispatcherTimer.IsEnabled) 
     dispatcherTimer.Stop(); 

    dispatcherTimer.Start(); 
    } 

    private void dispatcherTimer_Tick(object sender, EventArgs e) 
    { 
    displayedPassword = ""; 
    for (int i = 0; i < actualPassword.Length; i++) 
     displayedPassword += "•"; 

    tbPassword.Text = displayedPassword; 
    tbPassword.CaretIndex = displayedPassword.Length; 
    } 
+0

Я видел, что статья о генерализованной и привязки данных подозревал, что это может быть, поэтому я не мог найти встроенный вариант, чтобы включить Это. В моем случае клиент хочет предложить короткий числовой вывод в качестве «системы чести», альтернативной более безопасным параметрам проверки подлинности (например, смарт-картам) для своих конечных пользователей. Предполагая, что они непреклонны в том, чтобы включить его, пространство ключей, достаточно маленькое, чтобы тривиально брутфорсировать, даже если оно хранится с использованием медленного хэша, является настолько крупным открытием, что, возможно, тривиализирует такую ​​атаку в памяти. *вздох* –

Смежные вопросы