Хеш bcrypt нельзя «расшифровать»: чтобы узнать, верен ли пароль, используйте режим «Проверить». Всё вычисляется в вашем браузере, и пароль не отправляется ни на какой сервер.
Текущая версия. Её создают OpenBSD, Node.js, Python, Go и Rust.
Каждая единица стоимости удваивает время вычисления. OWASP рекомендует не меньше 10; оптимально — максимальное значение, которое ваш сервер вычисляет примерно за 250 мс.
Как это работает
bcrypt — хеш-функция, созданная для хранения паролей. В отличие от SHA-256 или MD5, которые вычисляются за микросекунды, bcrypt намеренно медленная: тому, кто украдёт базу данных, придётся годами перебирать пароли.
Каждый хеш содержит всё необходимое для проверки: версию алгоритма, стоимость и случайную соль длиной 128 бит. Поэтому один и тот же пароль каждый раз даёт другой хеш, а соль не нужно хранить отдельно.
Стоимость — это двоичный логарифм числа раундов: при стоимости 10 вычисляется 1024 раунда, при 12 — 4096. Увеличение на единицу удваивает время вычисления, что позволяет поспевать за ростом мощности оборудования, не меняя алгоритм.
Примеры
rasmuslerdorf$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1aПример password_verify() из руководства PHP: вставьте его в режиме «Проверить» с этим паролем, и он совпадёт.abc$2a$06$If6bvum7DFjUnE9p2uDeDu0YHzrHM6tf.iqN8.yx.jNN1ILEf7h0iТестовый вектор jBCrypt со стоимостью 6. Первые 22 символа после стоимости — соль, остальные 31 — результат.Сценарии использования
- Создать хеш начального пароля администратора, чтобы вставить его прямо в базу данных.
- Проверить, соответствует ли пароль сохранённому хешу, когда пользователь не может войти.
- Сгенерировать тестовые хеши для fixtures, seeds или автоматических тестов приложения на Laravel, Spring, Django или Node.js.
- Измерить, сколько времени занимает каждая стоимость, чтобы выбрать подходящее значение перед настройкой сервера.
- Создать записи для файлов .htpasswd Apache, которые принимают хеши bcrypt с префиксом $2y$.
Часто задаваемые вопросы
Можно ли расшифровать хеш bcrypt?
Нет. bcrypt — односторонняя функция: получить пароль из хеша невозможно. Можно лишь перебирать пароли-кандидаты и смотреть, совпадёт ли какой-нибудь, — именно это bcrypt и делает медленным.
Чем отличаются $2a$, $2b$ и $2y$?
Для обычных паролей все три вычисляют одно и то же. $2a$ — исходная версия; $2y$ ввёл PHP в 2011 году, чтобы отличать свои хеши от хешей реализации с ошибкой; $2b$ приняла OpenBSD в 2014 году, исправив другую ошибку с паролями длиннее 255 символов. Почти все библиотеки при проверке принимают все три.
Какую стоимость выбрать?
OWASP рекомендует не меньше 10. Оптимально — максимальное значение, которое ваш сервер может вычислить примерно за 250 мс на один вход. Spring Security по умолчанию использует 10; Laravel 11 и PHP 8.4 подняли своё значение до 12.
Почему bcrypt игнорирует всё, что длиннее 72 байт?
Алгоритм использует пароль как ключ Blowfish, который допускает не больше 72 байт. Остальное молча отбрасывается, поэтому два пароля с одинаковыми первыми 72 байтами дают один и тот же хеш. Кириллица, символы с диакритикой и эмодзи занимают от двух до четырёх байт, поэтому инструмент считает байты, а не символы.
Что лучше: bcrypt или Argon2?
Сегодня для новых систем рекомендуется Argon2id: помимо медлительности он использует много памяти, что удорожает атаки на GPU. Тем не менее bcrypt с подходящей стоимостью остаётся надёжным и используется по умолчанию в PHP, Laravel, Spring и Ruby on Rails.
Отправляется ли мой пароль на сервер?
Нет. Хеш и проверка вычисляются в вашем браузере, и пароль никогда не покидает ваше устройство; он также не включается в ссылку для того, чтобы поделиться инструментом.