Какой самый простой способ создать и сравнить соленый пароль в.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, который обеспечивает надежную передачу пароля и замедление хэша (что важно для хэшей паролей).

Статья проекта кода Джеффа Этвуда:

Этот класс хорошо документирован, ориентирован на строки и, что самое главное, прост! Это идеальное решение для получения дополнительной информации о шифровании.

Другие вопросы по тегам