Вынесение хеширования паролей на базе bcrypt.js в отдельный микросервис решает задачу изоляции криптографически чувствительных операций от основной бизнес-логики приложения. Такой подход становится особенно актуальным в распределённых системах, где аутентификация используется множеством сервисов и требуется единая политика безопасности.
Хеширование паролей — операция с высокой вычислительной стоимостью. Алгоритм bcrypt специально замедлен за счёт настраиваемого параметра cost factor, что снижает эффективность атак перебором. Это создаёт нагрузку на CPU и делает неэффективным выполнение хеширования внутри высоконагруженных API-сервисов.
Выделение микросервиса позволяет централизовать управление параметрами хеширования, унифицировать поведение системы и упростить аудит безопасности.
Библиотека bcrypt.js реализует алгоритм bcrypt полностью на JavaScript без нативных зависимостей. Это упрощает развертывание микросервиса в контейнерных средах, где сборка native-модулей может быть проблематичной.
Основные операции:
hash(password, saltRounds) — создание хешаcompare(password, hash) — проверка соответствия пароля
хешуgenSalt(saltRounds) — генерация соли (обычно
используется внутри hash)В контексте микросервиса чаще всего используется только две операции: создание хеша и проверка пароля.
Типовой сервис строится как stateless HTTP API, что позволяет масштабировать его горизонтально без изменения логики.
Основные компоненты:
Пример логической структуры:
auth-hash-service/
├── src/
│ ├── controllers/
│ ├── services/
│ ├── routes/
│ ├── utils/
├── app.js
├── config.js
├── package.json
Проектирование API должно исключать утечку чувствительной информации. Пароли никогда не сохраняются и не логируются.
POST /hash
Запрос:
{
"password": "user_password",
"cost": 12
}
Ответ:
{
"hash": "$2a$12$EIX/b..."
}
POST /compare
Запрос:
{
"password": "user_password",
"hash": "$2a$12$EIX/b..."
}
Ответ:
{
"match": true
}
Ядро сервиса базируется на Express или Fastify.
Пример логики хеширования:
import bcrypt from 'bcryptjs';
export async function hashPassword(password, cost = 12) {
const salt = await bcrypt.genSalt(cost);
return bcrypt.hash(password, salt);
}
Проверка:
import bcrypt from 'bcryptjs';
export async function comparePassword(password, hash) {
return bcrypt.compare(password, hash);
}
Контроллер:
export async function hashController(req, res) {
const { password, cost } = req.body;
const hash = await hashPassword(password, cost);
res.json({ hash });
}
Пароли обрабатываются в отдельном контуре, который можно:
Это снижает поверхность атаки всей системы.
Вместо рассинхронизации параметров bcrypt в разных сервисах, микросервис задаёт единый стандарт:
Изменения происходят централизованно без перекомпиляции всех сервисов.
bcrypt является CPU-bound операцией. Вынесение позволяет:
Параметр cost напрямую влияет на время вычисления:
t = 2^{cost}
где t — относительное время выполнения.
Рост cost на 1 увеличивает время хеширования примерно в 2 раза. Это означает, что выбор значения cost становится критическим для балансировки безопасности и производительности.
Типичные значения:
При высокой нагрузке синхронные HTTP-запросы к bcrypt могут стать узким местом. В таких случаях вводится очередь задач.
Схема:
Преимущества:
Микросервис хеширования должен быть недоступен извне публичной сети. Основные меры:
Особое внимание уделяется защите от:
Логи должны исключать любые чувствительные данные.
Разрешено:
Запрещено:
Метрики:
Вынесение bcrypt в отдельный сервис добавляет сетевую задержку. В некоторых сценариях локальное выполнение быстрее, чем RPC-вызов.
Появляются:
При неправильной архитектуре микросервис хеширования может стать критическим узлом системы аутентификации.
Для минимизации рисков применяются:
В системах с несколькими продуктами (web, mobile, internal tools) единый сервис хеширования позволяет:
При изменении параметров bcrypt важно поддерживать совместимость старых хешей.
Обычно хеш хранит информацию о версии:
$2a$12$...
$2b$10$...
Микросервис может:
Такое разделение обеспечивает контролируемую криптографическую зону внутри системы и снижает зависимость бизнес-логики от вычислительно тяжёлых операций.