Каков самый простой способ создать и сравнить засоленный пароль в .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 текст проекта проекта:

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