Какой самый простой способ создать и сравнить соленый пароль в.NET?
Постоянно пытаясь улучшить свой код, я ищу лучший способ создания и сравнения защищенного пароля в.NET.
Есть ли лучший или более безопасный способ сделать это?
Мой текущий код выглядит следующим образом:
public static string CreateSaltedPassword(string salt, string password)
{
SHA1CryptoServiceProvider SHA1 = null;
SHA1 = new SHA1CryptoServiceProvider();
// Convert the string into an array of bytes
byte[] byteValue = System.Text.Encoding.UTF8.GetBytes(salt + password);
// Compute the hash value
byte[] byteHash = SHA1.ComputeHash(byteValue);
// Dispose the unmanaged cryptographic object
SHA1.Clear();
return Convert.ToBase64String(byteHash);
}
public static bool ComparePasswords(string salt, string password, string storedPassword)
{
string passwordHash = string.Empty;
// Create the hashed password
passwordHash = PasswordProvider.CreateSaltedPassword(
salt, password);
// Compare the passwords
return (string.Compare(storedPassword, passwordHash) == 0);
}
3 ответа
Простая итерация хеш-функции недостаточна. Вы должны выполнить итерацию, но таким образом, чтобы сохранить энтропию, присутствующую в пароле. Как предлагается здесь, используйте Rfc2898DeriveBytes
для более безопасного подхода.
Вы должны сделать несколько тысяч итераций по хешу. Проведите некоторое тестирование, чтобы увидеть, сколько времени занимает ваша целевая машина: 10000 итераций и более не должны быть заметны пользователям, когда вы проверяете их ввод, но это изменит требование времени злоумышленника с часов на годы.
Источник соли и ее размер не показаны; соль не должна быть секретной, она просто должна быть непредсказуемой для данного пароля. 8 байт из криптографического RNG - это удобная и безопасная соль. Имена пользователей более удобны, но могут быть менее безопасными.
PBKDF2 обеспечивает разумную безопасность для большинства приложений сегодня. Следующим шагом в безопасности будет bcrypt или scrypt.
Вас могут заинтересовать мои ответы на подобные вопросы:
Используйте класс Rfc2898DeriveBytes из System.Security.Cryptography
,
Он встроен в.NET Framework начиная с версии 2.0 и реализует PBKDF2-HMACSHA1, который обеспечивает надежную передачу пароля и замедление хэша (что важно для хэшей паролей).
Статья проекта кода Джеффа Этвуда:
Этот класс хорошо документирован, ориентирован на строки и, что самое главное, прост! Это идеальное решение для получения дополнительной информации о шифровании.