Алгоритмы хеширования делятся на несколько категорий в зависимости от их назначения:
1. Криптографические хеш-функции общего назначения
Изначально разрабатывались для обеспечения целостности данных, цифровых подписей и других криптографических задач. Их ключевые свойства:
2. Алгоритмы для хранения паролей
Основная задача — замедление вычислений и усложнение атак перебором.
Алгоритмы вроде MD5 или SHA-256 остаются безопасными в контексте целостности данных, но плохо подходят для хранения паролей. Причины:
Высокая скорость вычислений Современные GPU и ASIC способны вычислять миллиарды хешей в секунду. Это делает атаки brute-force и dictionary attacks крайне эффективными.
Отсутствие встроенной защиты от перебора Нет механизма:
Уязвимость к радужным таблицам Без соли одинаковые пароли дают одинаковые хеши, что позволяет использовать заранее вычисленные базы.
bcrypt был разработан на основе алгоритма Blowfish с конкретной целью: безопасное хранение паролей.
Ключевые задачи bcrypt:
1. Использование соли (salt) Каждый пароль дополняется случайной строкой. Это означает:
2. Cost factor (параметр сложности) bcrypt вводит
параметр cost, который определяет количество итераций:
Пример:
3. Адаптивность С ростом производительности железа можно увеличивать cost без изменения алгоритма.
| Характеристика | MD5 / SHA-256 | bcrypt |
|---|---|---|
| Скорость | Очень высокая | Намеренно низкая |
| Соль | Вручную | Встроена |
| Защита от brute-force | Слабая | Высокая |
| Адаптивность | Нет | Есть |
bcrypt выигрывает за счёт контролируемой медлительности, что критично для защиты паролей.
scrypt был создан как улучшение bcrypt:
Отличия:
bcrypt:
scrypt:
bcrypt остаётся проще в реализации и широко поддерживается.
Argon2 — современный стандарт (победитель Password Hashing Competition).
Преимущества Argon2:
Почему bcrypt всё ещё используется:
В JavaScript bcrypt представлен через библиотеку bcrypt.js:
Особенности bcrypt.js:
Однако:
Несмотря на появление более современных алгоритмов, bcrypt продолжает широко использоваться благодаря:
1. Балансу безопасности и простоты Не требует сложной настройки.
2. Стандартизации Поддерживается во множестве фреймворков:
3. Достаточной стойкости При корректной настройке
cost обеспечивает высокий уровень защиты.
Отсутствие memory-hard механизма bcrypt не использует память как фактор защиты.
Ограничение длины пароля Пароль обрезается до 72 байт.
Зависимость от правильной настройки cost Слишком низкое значение делает систему уязвимой.
bcrypt подходит для:
Менее предпочтителен:
bcrypt занимает промежуточное положение:
Его можно рассматривать как:
Такое положение объясняет его широкое распространение и долгосрочную актуальность в индустрии разработки.