Каков самый простой способ создать и сравнить засоленный пароль в .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);
}
Ответы
Ответ 1
Простое повторение хэш-функции недостаточно. Вам нужно выполнить итерацию, но таким образом, чтобы сохранить энтропию, присутствующую в пароле. Как предложено здесь, используйте Rfc2898DeriveBytes
для более безопасного подхода.
Вы должны сделать несколько тысяч итераций через хэш. Проведите некоторое тестирование, чтобы узнать, сколько времени потребуется на вашей целевой машине: 10000 итераций или более не должны быть заметны для пользователей, когда вы проверяете их ввод, но это изменит требование времени нападающего от нескольких часов до нескольких лет.
Источник и размер соли не показаны; соль не обязательно должна быть секретной, она просто должна быть непредсказуемой для данного пароля. 8 байтов из криптографического RNG - удобная и безопасная соль. Имена пользователей более удобны, но могут быть менее безопасными.
PBKDF2 обеспечивает разумную безопасность для большинства приложений сегодня. Следующим шагом в безопасности будет bcrypt или scrypt.
Вас могут заинтересовать мои ответы на эти похожие вопросы:
Ответ 2
Используйте Rfc2898DeriveBytes класс System.Security.Cryptography
.
Он встроен в платформу .NET с версии 2.0, и он реализует PBKDF2-HMACSHA1, который обеспечивает надежное вскрытие пароля и замедление хэша (что критично для хэшей паролей).
Ответ 3
Jeff Atwood текст проекта проекта:
Этот класс сильно документирован, строка ориентирована и, прежде всего, просто! Он идеально подходит для обучения более о шифровании.