Редко когда-либо есть причина хранить зашифрованную версию пароля. Это создает уязвимость безопасности. Вместо этого обычно лучше хранить односторонний хэш (например, с использованием SHA1) пароля в сочетании со случайной солью. Затем вы всегда сравниваете хеш введенных паролей с хешами, хранящимися в базе данных, а не сравниваете пароли.
Преимущество этого подхода заключается в том, что никто не может определить, какой пароль у пользователя, даже если он или она получает доступ к базе данных. И соль заставляет идентичные пароли казаться отличными друг от друга.
Ниже приведен пример создания случайной соли с использованием пространства имен System.Security.Cryptography
.
byte[] salt = new byte[10];
RandomNumberGenerator.Create().GetBytes(salt);
Вы можете объединить соль с паролем и сгенерировать односторонний хеш следующим образом:
byte[] passwordBytes = new byte[Encoding.UTF8.GetByteCount(password) + salt.Length]; // Create buffer for password bytes and hash
int passwordLength = Encoding.UTF8.GetBytes(password, 0, password.Length, passwordBytes, 0);
salt.CopyTo(passwordBytes, passwordLength);
byte[] hash = null;
using (SHA512Managed hasher = new SHA512Managed()) {
hash = hasher.ComputeHash(passwordBytes);
}
Сохраните хешированный пароль и соль. При аутентификации пользователя используйте ту же соль, что и при создании сохраненного хэша, чтобы хэшировать пароль, введенный пользователем. Сравните этот новый хеш с базой данных.