Looking for c# Keywords? Try Ask4Keywords

C# Language Хеширование паролей


пример

Пароли никогда не должны храниться как обычный текст! Они должны быть хэшированы со случайно генерируемой солью (для защиты от атак радужного стола) с использованием медленного алгоритма хэширования пароля. Большое количество итераций (> 10k) может быть использовано для замедления атаки грубой силы. Задержка ~ 100 мс приемлема для входа пользователя в систему, но затрудняет нарушение длинного пароля. При выборе количества итераций вы должны использовать максимально допустимое значение для своего приложения и увеличивать его по мере повышения производительности компьютера. Вам также необходимо будет рассмотреть возможность повторения повторяющихся запросов, которые могут быть использованы как DoS-атака.

При хэшировании в первый раз соль может быть сгенерирована для вас, полученный хеш и соль могут быть затем сохранены в файле.

private void firstHash(string userName, string userPassword, int numberOfItterations)
{
    Rfc2898DeriveBytes PBKDF2 = new Rfc2898DeriveBytes(userPassword, 8, numberOfItterations);    //Hash the password with a 8 byte salt
    byte[] hashedPassword = PBKDF2.GetBytes(20);    //Returns a 20 byte hash
    byte[] salt = PBKDF2.Salt;
    writeHashToFile(userName, hashedPassword, salt, numberOfItterations); //Store the hashed password with the salt and number of itterations to check against future password entries
}

Проверка существующего пароля пользователя, чтение хеша и соли из файла и сравнение с хешем введенного пароля

private bool checkPassword(string userName, string userPassword, int numberOfItterations)
{
    byte[] usersHash = getUserHashFromFile(userName);
    byte[] userSalt = getUserSaltFromFile(userName);
    Rfc2898DeriveBytes PBKDF2 = new Rfc2898DeriveBytes(userPassword, userSalt, numberOfItterations);    //Hash the password with the users salt
    byte[] hashedPassword = PBKDF2.GetBytes(20);    //Returns a 20 byte hash            
    bool passwordsMach = comparePasswords(usersHash, hashedPassword);    //Compares byte arrays
    return passwordsMach;
}