Это не путь к go. PasswordHelper
класс и их лайки должны быть забанены в inte rnet. Свойство PasswordBox.Password
не может быть привязано по очень веской причине, которая хорошо документирована. Доступ к этому свойству создаст текстовое представление string
, которое можно легко получить с помощью бесплатных инструментов, например, Microsoft Process Explorer.
Когда вы получаете значение свойства Password, вы выставляете пароль в виде простого текста в памяти. Чтобы избежать этой потенциальной угрозы безопасности, используйте свойство SecurePassword, чтобы получить пароль в качестве SecureString.
Если для этого свойства задано значение NULL, для базового пароля будет установлено значение Пусто.
You даже хранить значение простой соли в памяти - я действительно надеюсь, что это не коммерческое и не публичное c приложение. У вас нет абсолютно никакого контроля, когда сборщик мусора удалит любое значение из памяти. Поскольку String
является неизменяемым типом, весьма вероятно, что несколько копий пароля пользователя останутся в памяти c.
Рекомендуемая аутентификация в среде Windows заключается в использовании Windows API аутентификации пользователя.
По крайней мере, необходимо очистить свойство PasswordBox.Password
, установив его null
.
Шифрование не должно выполняться в представлении.
И, пожалуйста, напишите ответственный код! Данные пользователя не ваши данные!
MainWindow.xaml
<Window>
<Window.DataContext>
<ViewModel />
</Window.DataContext>
<PasswordBox x:Name="PasswordBox" />
</Window>
MainWindow.xaml.cs
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.PasswordBox.PasswordChanged += OnPasswordChanged;
}
private void OnPasswordChanged(object sender, RoutedEventArgs e)
{
(this.DataContext as ViewModel).Password = this.PasswordBox.SecurePassword;
}
}
ViewModel.cs
pucblic class ViewModel
{
private Model Model { get; }
private SecureString password;
public SecureString Password
{
private get => this.password;
public set
{
this.password = value;
OnPasswordChanged();
}
}
private void OnPasswordChanged()
{
// Hash password in the model e.g. to compare it to a hashed database value
this.Model.TryLogin(this.Password);
}
}
Model.cs
public class Model
{
public bool TryLogin(SecureString password)
{
IntPtr unmanagedString = Marshal.SecureStringToGlobalAllocUnicode(password);
string hashedPassword = HashPassword(Marshal.PtrToStringUni(unmanagedString));
return PasswordIsValid(hashedPassword);
}
private string HashPassword(string unsecurePassword)
{
// Hash algorithm
}
}