Как bcrypt лучше подходит для будущего, чем увеличение количества итераций SHA?

Я изучал хеширование bcrypt и, конечно же, одно из больших преимуществ схемы — ее «адаптивность». Однако, как это может быть более адаптивным, чем простое увеличение количества итераций, которые вы делаете по хэшу SHA-1? Скажем, вместо того, чтобы SHA-1 хэшировал значение 1000 раз, вы увеличиваете его до 10 000 итераций. Разве это не достижение той же цели? Что делает bcrypt более адаптивным?


person TaylorOtwell    schedule 22.07.2011    source источник


Ответы (6)


Выполнение многих итераций с помощью хеш-функции имеет несколько тонкостей, потому что должна быть задействована какая-то «засолка», и потому что существующие хеш-функции не такие «случайные», как можно было бы надеяться; поэтому нужно соблюдать осторожность, и в этом случае вы получите PBKDF2. PBKDF2 был разработан для получения ключей, что не совсем то же самое, что и хэширование паролей, но оказалось, что и в этом он неплохо справляется.

bcrypt имеет (небольшое) преимущество перед PBKDF2-with-SHA-1 в том, что bcrypt получен из Blowfish блочный шифр. Смысл множества итераций в том, чтобы сделать обработку пароля медленной и, в частности, медленной для злоумышленника. Мы допускаем, что эта функция работает медленно для нормальных, честных систем, потому что она препятствует тщательному подбору пароля. Но злоумышленник может использовать оборудование, которое не использует обычная система, например. программируемый графический процессор, который значительно ускоряет вычисления, которые хорошо подходят для такого оборудования. Blowfish и bcrypt используют таблицы поиска в оперативной памяти (таблицы, которые модифицируются во время обработки); с такими таблицами легко работать на ЦП общего назначения, но они довольно громоздки на ГП; таким образом, bcrypt несколько препятствует совершенствованию обработки злоумышленником с помощью графического процессора. Это бонус, который делает bcrypt более предпочтительным для хранения паролей, чем PBKDF2.

person Thomas Pornin    schedule 24.07.2011

Альтернативой обоим является scrypt. В отличие от bcrypt, он не использует несколько необычный шифр Blowfish, вместо этого использует любую стандартную хеш-функцию, и он специально разработан так, чтобы его было сложно реализовать на выделенном оборудовании, поскольку он неэффективен как с точки зрения памяти, так и с точки зрения времени.

person Nick Johnson    schedule 25.07.2011

Ваш вариант немного недоработан. Вы не сказали, как вы объединяете пароль и соль в свою схему хеширования. Выполнение этого неправильным образом может привести к уязвимостям. Преимущество bcrypt (и других стандартных KDF) заключается в том, что это хорошо определено.

Если вы посмотрите на PBKDF2 в обычном режиме HMAC-SHA1, он очень похож на то, что вы предлагаете.

person CodesInChaos    schedule 22.07.2011

Вот и все. Вы можете повторить любую хэш-функцию. Некоторые хеш-функции лучше других, поэтому выбирайте тщательно.

MD5, например, в наши дни считается сломанным и относится к категории хеш-функций, которые страдают от определенных атак на основе префиксов и атак дня рождения.

bcrypt является хорошим эмпирическим правилом, потому что он правильно понимает несколько вещей (например, соль), которые вам пришлось бы явно реализовать, если бы вы использовали другую функцию.

person spraff    schedule 22.07.2011
comment
Я не думаю, что MD5 не работает для хорошо известных функций вывода ключей. В любом случае, использование MD5 (которая является довольно быстрой хеш-функцией) для получения ключа не имеет смысла, если вы намеренно пытаетесь замедлить перебор, если только нет серьезных ограничений на использование, например. SHA-256 или SHA-512. - person Maarten Bodewes; 23.07.2011

Как отмечено в другом ответе, механизм повторения хеш-функции очень важен, потому что он может неожиданно ослабить алгоритм или по-прежнему не сможет предотвратить некоторые атаки компромисса между временем и памятью.

Вот почему PBKDF2 — ваш друг. Это подробно описано в RFC 2898. PBKDF2 также ориентирован на будущее, поскольку не зависит от конкретного алгоритма хеширования. Например, можно заменить MD5 на SHA3, когда SHA3 будет завершен NIST.

Кроме того, небольшая зацепка на перспективу. Bcrypt будет работать, если парольная фраза, которую вы защищаете, «от 8 до 56 символов». Важный момент, о котором следует помнить, если по какой-то причине в будущем вам потребуются более длинные парольные фразы.

person Mike    schedule 22.07.2011
comment
Ваша ссылка ведет на программу bcypt, а не на bcrypt KDF. - person CodesInChaos; 24.07.2011
comment
Да, это был косвенный комментарий, не связанный с KDF (который полагается на bcrypt в названии, а не на шифре). Это должно было указать на важность понимания алгоритма хэширования/шифрования, используемого в KDF, а также того, как работает сам KDF. На самом деле, этот вопрос освежил мою память о крипте Unix, ограничении в 8 символов и истории об AOL несколько лет назад: voices.washingtonpost.com/securityfix/2007/05/ - person Mike; 25.07.2011

Я считаю, что «адаптивность» не имеет ничего общего с фактическим шифрованием, но вместо этого bcrypt является адаптивным хэшем: со временем его можно делать все медленнее и медленнее, чтобы он оставался устойчивым к конкретным атакам методом грубой силы против хэша и соли.

(Частично цитата из http://en.wikipedia.org/wiki/Bcrypt)

person tomthorgal    schedule 22.07.2011
comment
Это даже отдаленно не отвечает на вопрос. - person John Bartholomew; 05.08.2011