В классической криптографии под детерминированностью понимается свойство функции выдавать одинаковый результат при одинаковых входных данных. Для обычных хеш-функций это базовая характеристика: один и тот же вход всегда даёт один и тот же хеш.
В контексте паролей такая предсказуемость становится уязвимостью. Если функция полностью детерминирована, злоумышленник может заранее вычислить хеши популярных паролей и сопоставлять их с базой данных — так работают радужные таблицы.
bcrypt.js формально использует детерминированный алгоритм внутри вычисления хеша, но поверх него вводится неконтролируемая случайность через соль, что радикально меняет модель безопасности.
Стохастичность в криптографии — это намеренное введение случайности в процесс преобразования данных. В случае bcrypt.js она реализуется через генерацию соли (salt).
Соль — это случайная строка, которая добавляется к паролю до выполнения хеширования. Благодаря этому одинаковые пароли почти никогда не приводят к одинаковым хешам.
Ключевая особенность:
Именно сочетание детерминизма и стохастичности создаёт криптографическую устойчивость bcrypt.
В bcrypt.js соль не является дополнительным параметром «для усложнения». Она — обязательная часть алгоритма.
Структура работы выглядит следующим образом:
Соль хранится вместе с хешем в итоговой строке. Это важно: восстановление пароля не требует хранения соли отдельно, но и не позволяет предвычислять значения.
Если два пользователя используют одинаковый пароль, bcrypt.js всё равно создаёт разные хеши. Причина в том, что для каждого вызова используется новая случайная соль.
Пример логики:
password123Хотя исходная строка идентична, итоговые значения полностью различаются.
Это разрушает ключевую слабость детерминированных хешей — возможность массового предвычисления.
Несмотря на внешнюю случайность, bcrypt остаётся строго детерминированным алгоритмом при фиксированных входных параметрах:
Если все три значения совпадают, результат всегда одинаков.
Это означает:
Такое разделение критично: оно позволяет проверять пароль без хранения исходного значения.
Важной частью модели bcrypt является параметр cost factor — степень вычислительной сложности.
Он задаёт количество итераций внутреннего шифрования. При одинаковых входных данных:
Это добавляет ещё один уровень «контролируемой предсказуемости»: алгоритм всегда ведёт себя одинаково, но его стоимость выполнения заранее известна и регулируема.
Без соли хеширование паролей подвержено атаке радужных таблиц — предварительно вычисленных наборов значений.
В детерминированной системе:
bcrypt.js разрушает эту модель:
Стохастичность здесь не случайность ради случайности, а инструмент разрушения предсказуемости массовых атак.
Результирующая строка bcrypt содержит несколько компонентов:
Эта структура делает результат самодостаточным: для проверки пароля не требуется внешних данных, кроме самой строки хеша.
При проверке выполняется повторное детерминированное вычисление с извлечённой солью и сравнением результата.
Обычные криптографические функции вроде SHA-256:
bcrypt.js:
Разница заключается не в алгоритме хеширования как таковом, а в модели входных данных.
Стохастичность bcrypt не означает непредсказуемость самого алгоритма. Случайность ограничена только этапом генерации соли. После этого процесс становится полностью детерминированным.
Такое сочетание даёт важный эффект:
В результате система одновременно остаётся проверяемой и непредсказуемой на уровне входных данных.