BCrypt vs PBKDF2WithHmacSHA1

Какой алгоритм следует использовать для безопасного хеширования паролей? BCrypt или же PBKDF2WithHmacSHA1?

Что является более безопасным? PBKDF2WithHmacSHA1 встроен в Java в то время как BCrypt доступно через библиотеку jBCrypt (которая в основном получила положительные отзывы).

Также если я пойду с BCrypt я должен ограничить ввод пароля моего пользователя только 55 символами (так как это ограничение BCrypt)?

Было бы полезно, если вы Java конкретный.
Обратите внимание, что я бы выбрал вариант, который делает пароли более безопасными и более грубыми.

2 ответа

Решение

Они не одинаковы, и они не одинаково безопасны.

На процессоре они оба используют примерно одинаковое количество ресурсов и примерно одинаковы при защите пароля.

Проблема сводится к атакам на GPU. Благодаря архитектуре графических процессоров, bcrypt на самом деле сложнее в работе, чем SHA1 (или SHA256). Поэтому проще распараллелить PBKDF2 + sha1, чем bcrypt.

Чтобы обозначить некоторые реальные цифры, мы будем использовать эту презентацию.

Sha-1 примерно в 3 раза дороже, чем md5. Итак, если мы посмотрим на медленные слайды функции хеширования, мы можем заключить, что md5crypt примерно в 3 раза быстрее, чем pbkdf2-sha1. Это довольно сложная догадка, но она находится на грани того, что мы ищем.

Это означает, что при равной производительности ЦП мы можем ожидать, что PBKDF2-sha1 будет выполнять около 25 миллионов хэшей в секунду в кластере графического процессора. Сравните это с BCrypt (со стоимостью 5), который работает со скоростью 75 тысяч хэшей в секунду.

Таким образом, это означает, что PBKDF2 + sha1 примерно в 1000 раз слабее, чем bcrypt при настройках эквивалентной стоимости.

Обратите внимание, что PBDFK2+sha512 почти так же медленно, как bcrypt. Это связано с SHA-512, использующим 64-битные операции (которые не являются родными в современных графических процессорах).

Короче говоря, bcrypt на несколько порядков более безопасен, чем PBKDF2+SHA1. Это более безопасно, чем PBKDF2+SHA512, но не настолько сильно.

И это зависит от архитектуры GPU сегодняшнего дня. В будущем, если размеры кеша и наборы команд существенно изменятся, эти различия могут исчезнуть. И именно поэтому существуют более новые алгоритмы, такие как scrypt.

Так что просто используйте bcrypt. И не беспокойтесь об ограничении персонажа

Это не имеет большого значения.

Разница между безопасностью двух из них не настолько существенна, чтобы сделать осмысленный выбор. Если вы ищете подробное обсуждение, взгляните на обе ссылки в комментариях Евгения.

Важно то , что вы их правильно.

Это означает:

  • Выбор правильного коэффициента стоимости / количества итераций. Если вы тщательно, вы захотите оценить, насколько медленная хеш-функция может выдержать ваш сервер. Чем медленнее (= более высокий коэффициент затрат / количество итераций), тем лучше. Чтобы дать вам приблизительный номер, мое программное обеспечение для полного шифрования диска определило, что PBKDF2 с HmacSHA1 требуется ~10000 итераций для выполнения 50 мс.
  • Правильное использование соли: каждому паролю требуется сопутствующее случайное значение (соль), которое вы храните вместе с хэшем и используете в качестве входных данных для каждого хэширования. Не используйте одну и ту же соль с каждым паролем, это было бы здорово и приятно, но не заменит соль.
  • Храните свой пароль в обновляемом виде. Через некоторое время вы можете захотеть изменить коэффициент стоимости, добавить значение перца или изменить схему хеширования на scrypt, как только она станет общепринятой. Чтобы учесть это, записи базы данных должны указывать, какой выбор параметров использовался для генерации пароля. В качестве примера рассмотрим этот обычно используемый формат хранения паролей Unix.

"Также, если я перейду к BCrypt, я должен ограничить ввод пароля моего пользователя только 55 символами (так как это предел BCrypt)?"

Нет. Хэш-пароль один раз с SHA1 или SHA256 и используйте вывод, как вы использовали бы пароль раньше. Если вы хотите применить перец, это место, чтобы сделать это. Наконец, если это звучит как большая часть хлопот, это может быть решающим фактором для использования PBKDF2 вместо bcrypt.

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