bcrypt.js используется для криптографического хэширования паролей на стороне Node.js и является одним из ключевых инструментов при построении систем аутентификации, которые должны корректно работать в условиях горизонтального масштабирования.
Основная задача библиотеки — преобразование пароля в необратимый хэш с использованием адаптивной функции стоимости (cost factor), которая регулирует вычислительную сложность операции.
= 2^{}
Увеличение значения cost factor экспоненциально повышает время вычисления хэша, что напрямую влияет на устойчивость к перебору, но одновременно увеличивает нагрузку на CPU при аутентификации пользователей.
В распределённой архитектуре приложение обычно разворачивается на нескольких экземплярах (инстансах), за балансировщиком нагрузки. Каждый инстанс выполняет одинаковую бизнес-логику, включая операции регистрации и входа.
bcrypt.js полностью локален и не требует внешнего состояния, что делает его совместимым с горизонтальным масштабированием. Однако его вычислительная стоимость становится критическим фактором:
hash() при регистрации создаёт нагрузку на
CPUcompare() при логине выполняет дорогостоящее
сравнение хэшейВ системах с высокой нагрузкой bcrypt становится не узким местом хранения, а узким местом вычислений.
Stateless-аутентификация означает отсутствие серверного хранения сессий. Вместо этого используется токен (чаще всего JWT), который содержит информацию о пользователе и подписывается сервером.
bcrypt.js в такой архитектуре используется только на этапе:
После успешного входа сервер не хранит состояние пользователя, а доверяет токену.
Это разделение критично для масштабируемости: ни один из инстансов не зависит от локальной памяти или общей сессии.
bcrypt не требует синхронизации между серверами. Один и тот же пароль всегда даёт один и тот же результат при одинаковых параметрах salt и cost factor.
H = (P, S, c)
где:
Это свойство позволяет свободно масштабировать backend без дополнительных механизмов координации.
bcrypt специально разработан как медленный алгоритм. Это означает, что при увеличении количества инстансов линейного ускорения может не происходить, если нагрузка упирается в вычисления.
Типичная проблема в масштабируемых системах:
bcrypt.compareT ^{c}
где:
Даже небольшое увеличение cost factor резко увеличивает задержки, что в распределённой системе проявляется как рост p95/p99 latency.
В системах с горизонтальным масштабированием балансировщик распределяет запросы между инстансами. bcrypt.js не влияет на маршрутизацию, но влияет на:
При росте нагрузки узлы начинают деградировать не из-за базы данных или сети, а из-за CPU-bound операций сравнения хэшей.
Использование JWT устраняет необходимость хранить сессии, что упрощает масштабирование:
bcrypt.js в этой модели выполняет только роль первичной проверки, не участвуя в дальнейшей идентификации пользователя.
Типичный поток аутентификации:
bcrypt.compareКлючевая особенность: bcrypt участвует только в начале сессии, а не в каждом запросе.
В масштабируемых системах bcrypt создаёт специфический профиль нагрузки:
Проблема усиливается при использовании высоких cost factor, особенно в системах с ограниченными ресурсами контейнеров.
При увеличении количества инстансов:
Таким образом, масштабируется не bcrypt, а количество параллельных CPU-ресурсов, необходимых для его выполнения.
bcrypt автоматически генерирует соль для каждого пароля, что делает невозможным использование радужных таблиц.
H_1 H_2 ; }
Это свойство обеспечивает безопасность даже в распределённых системах, где база данных может быть реплицирована между регионами или дата-центрами.
bcrypt.js органично вписывается в stateless-модель:
Основная стоимость переносится в CPU-вычисления, что делает масштабирование задачей управления ресурсами, а не архитектурной согласованности.