bcrypt-хеш представляет собой строку фиксированного формата, в которой закодированы все параметры, необходимые для проверки пароля. В отличие от многих других алгоритмов, bcrypt не хранит отдельно соль или параметры — всё включено непосредственно в итоговую строку.
Структура bcrypt-хеша выглядит следующим образом:
$<версия>$<cost>$<соль><хеш>
Пример:
$2b$10$eImiTXuWVxfM37uY4JANjQ==qP5Zp7yZ3GQ8WZx7h1Y5s9X5FhQhW
Каждая часть строки имеет строго определённое назначение.
Первая часть строки определяет версию bcrypt:
$2a$, $2b$, $2y$
Наиболее распространённые варианты:
В контексте bcrypt.js чаще всего используется версия
2a или
2b. Различия
между ними касаются внутренних исправлений и совместимости, но для
практического использования это прозрачно — библиотека сама корректно
обрабатывает нужную версию.
Следующий компонент — это параметр сложности:
$2b$10$
Число 10 — это cost factor (или work
factor). Он определяет, сколько раз будет выполняться алгоритм
хеширования.
Фактически это степень двойки:
количество итераций = 2^cost
Примеры:
Чем выше значение:
Особенности:
Следующая часть — это соль:
eImiTXuWVxfM37uY4JANjQ==
Особенности соли в bcrypt:
Назначение соли:
Пример:
password123 → разные соли → разные хеши
bcrypt автоматически генерирует соль, поэтому вручную управлять ей обычно не требуется.
После соли следует непосредственно результат хеширования:
qP5Zp7yZ3GQ8WZx7h1Y5s9X5FhQhW
Особенности:
длина: 24 байта (192 бита)
также кодируется в Base64
формируется на основе:
Итоговый хеш всегда имеет фиксированную длину строки (~60 символов).
Пример:
$2b$10$eImiTXuWVxfM37uY4JANjQ==qP5Zp7yZ3GQ8WZx7h1Y5s9X5FhQhW
Разделение:
| Часть | Значение |
|---|---|
$2b$ |
версия алгоритма |
10 |
cost factor |
eImiTXuWVxfM37uY4JANjQ== |
соль (16 байт) |
qP5Zp7yZ3GQ8WZx7h1Y5s9X5FhQhW |
хеш (24 байта) |
При проверке пароля bcrypt:
Извлекает из строки:
Повторно хеширует введённый пароль с этими параметрами
Сравнивает полученный результат с сохранённым хешем
Ключевой момент:
bcrypt использует модифицированный Base64, который отличается от стандартного:
=Это важно учитывать при ручной обработке строк — стандартные Base64-декодеры могут не подойти.
Встроенная соль
Настраиваемая сложность
Самодостаточность
Медленное вычисление
При вызове:
bcrypt.hash(password, 10)
происходит:
Результат уже содержит:
При проверке:
bcrypt.compare(password, hash)
библиотека:
| $2b$ | 10 | $ | соль (22 символа) | хеш (31 символ) |
Общая длина строки:
60 символов
bcrypt-хеш — это не просто результат хеширования, а контейнер, включающий:
Такая структура делает bcrypt самодостаточным, переносимым и устойчивым к большинству распространённых атак на пароли.