Есть ли встроенная функция для хэширования паролей в .NET? - PullRequest
5 голосов
/ 23 января 2010

Я видел этот вопрос Шифрование / хеширование паролей в виде простого текста в базе данных

и я знаю, что не должен делать md5 («соль» + пароль); и я вижу реализацию в Python для решения.

Существует ли встроенная функция .NET с параметрами, которую я могу использовать вместо написания своих собственных?

Ответы [ 4 ]

2 голосов
/ 23 января 2010

Я не думаю, что есть одна функция, но вы можете сделать это в несколько строк (здесь используется SHA512, но есть другие варианты):

using (var sha = new SHA512CryptoServiceProvider())
{
    byte[] hashed = sha.ComputeHash(Encoding.Default.GetBytes(saltedPassword));
    string output = Convert.ToBase64String(hashed);
}

Убедитесь, что вы используете один из классов Crypto ..., чтобы обеспечить использование более безопасного алгоритма.

1 голос
/ 20 февраля 2014

Да. В .NET Framework 2.0 и более поздних версиях (до версии 4.5 включительно) в настоящее время реализуется PBKDF2 (также известный как RFC2898 и PKCS # 5v2) в классе с именем Rfc2898DeriveBytes . Технически, он реализует PBKDF2-HMAC-SHA-1, который, хотя и не так хорош, как PBKDF2-HMAC-SHA-512, все же подходит для хеширования пароля.

Аргументы PBKDF2:

  • HMAC не является аргументом для этого класса - HMAC-SHA-1 исправлен в этой реализации, поэтому вам не нужно об этом беспокоиться.
  • Пароль - пароль пользователя.
    • открытый текст, конечно же, отбрасывается после хеширования.
  • Salt - это криптографически случайная строка на строку достаточной длины (например, не менее 8 байтов). Каждому паролю нужна своя случайная соль, поэтому, если все 300 пользователей выберут «P @ $$ w0rd» в качестве пароля, результаты хеширования будут разными.
    • соль хранится в виде открытого текста в базе данных; он понадобится вам в следующий раз, когда вы создадите хэш пароля, чтобы увидеть, будет ли результат таким же.
  • Итерации - это количество повторений цикла. Для любого настольного или серверного оборудования начните с десятков тысяч и поднимайтесь до тех пор, пока это не повредит.
    • количество итераций также должно храниться в незашифрованном виде в базе данных, чтобы впоследствии было проще изменить это число (т. Е. Сделать его выше по мере увеличения вычислительной мощности).
  • .GetBytes - это длина вывода в байтах, как вы уже догадались. В этом случае вы должны использовать 20.
    • Причина (расширенное обсуждение): для хэширования пароля это никогда не должно быть больше, чем собственный размер хеша, потому что злоумышленнику не нужно будет генерировать больше, чем это (а создание собственного размера хеша + 1 байт занимает вдвое больше времени, так как он запускает новый набор итераций для каждой собственной величины размера хэша в выходной длине, объединяя результаты вместе - злоумышленник может с уверенностью предположить, что, если первый выходной совпадет, все будет совпадать, и он на 100% уверен, что если первый блок терпит неудачу, это не совпадение). Поскольку этот класс ограничен SHA-1, собственный размер хэша составляет 20 байтов. Если вы используете другую библиотеку, у которой есть опция, SHA-256 составляет 32 байта, SHA-512 составляет 64 байта.

Обратите внимание, что HMACSHA512 против Rfc2898DeriveBytes для хэша пароля содержит пример кода .NET, который я не проанализировал подробно, но который может быть полезной отправной точкой.

1 голос
/ 19 октября 2012

Нет, вы не должны использовать MD5 для хеширования пароля !!!!!

Плохой !!!!! Также вы не должны использовать соль + пароль за один проход Hash (md5 или другой) !!! Плохо !!!! * * 1003

Кроме того, вы не должны делать хеширование соль + пароль несколько раз (разворачивает XOR каждый проход по хешу согласно PBKDF2 !!! Плохо !!!!

Используйте этот API: https://sourceforge.net/projects/pwdtknet Хорошо !!!!!

1 голос
/ 23 января 2010

Проверить FormsAuthentication.HashPasswordForStoringInConfigFile

string hashMD5 = FormsAuthentication.HashPasswordForStoringInConfigFile(Pass + Salt, "MD5");

string hashSHA1 = FormsAuthentication.HashPasswordForStoringInConfigFile(Pass + Salt, "SHA1");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...