bcrypt.js вступает в работу уже после того, как пароль был передан в систему. Это ключевой момент, который часто недооценивается: сама библиотека отвечает только за криптографическое преобразование строки в хеш и последующую проверку, но не влияет на то, как именно пароль попадает на сервер.
Именно участок между вводом пароля пользователем и его первым попаданием в обработчик сервера является наиболее критической зоной. В этот промежуток пароль существует в открытом виде, и вся безопасность в этот момент определяется исключительно транспортным уровнем.
Передача данных между клиентом и сервером происходит через сетевые протоколы. В современных веб-приложениях это почти всегда HTTP поверх TLS (HTTPS). TLS создаёт защищённый канал, в котором данные шифруются до передачи и расшифровываются только на стороне получателя.
Если TLS отсутствует или настроен некорректно, пароль проходит по сети в открытом виде. В такой модели bcrypt.js не имеет никакого значения: хеширование происходит уже после того, как секрет мог быть перехвачен.
Граница доверия в системе проходит не через базу данных и не через bcrypt, а через момент установления защищённого соединения.
Самая базовая уязвимость — использование обычного HTTP. В этом случае любые промежуточные узлы сети могут видеть тело запроса целиком, включая пароль.
Типичные сценарии перехвата:
Атака типа MITM позволяет злоумышленнику вставать между клиентом и сервером. В зависимости от условий сети он может:
Если TLS не используется или пользователь принудительно игнорирует предупреждения браузера, пароль становится доступным в чистом виде.
Даже при наличии HTTPS возможен сценарий понижения уровня защиты. Злоумышленник перехватывает первоначальный HTTP-запрос и не позволяет клиенту перейти на HTTPS, подменяя ссылки или перенаправления.
Без механизмов принудительного HTTPS (например, HSTS) пользователь может даже не заметить, что соединение осталось незащищённым.
Если атакующий контролирует DNS-ответы или сетевую маршрутизацию, пользователь может быть направлен на поддельный сервер с валидным интерфейсом авторизации. В этом случае bcrypt.js на стороне настоящего сервера вообще не участвует — пароль уходит напрямую злоумышленнику.
bcrypt.js решает задачу хранения и проверки паролей, а не их передачи.
Его свойства:
Но ни одно из этих свойств не помогает, если пароль был украден до хеширования.
Если злоумышленник получает пароль до выполнения bcrypt.hash, он получает исходный секрет в чистом виде и может:
Иногда появляется идея выполнить bcrypt.hash на стороне браузера и отправлять уже хеш.
Проблема в том, что:
bcrypt не предназначен для замены защищённого канала связи.
Безопасная архитектура предполагает последовательность:
Пример серверной проверки:
import bcrypt from "bcryptjs";
async function login(req, res) {
const { password, user } = req.body;
const hashFromDb = user.passwordHash;
const isValid = await bcrypt.compare(password, hashFromDb);
if (!isValid) {
return res.status(401).send("Invalid credentials");
}
return res.status(200).send("OK");
}
В этой модели bcrypt используется только внутри доверенной серверной зоны.
Одного включённого HTTPS недостаточно. Важно исключить возможность первого незащищённого запроса.
HTTP Strict Transport Security (HSTS) решает эту проблему:
Даже при HTTPS существуют зоны риска внутри инфраструктуры:
Если TLS завершается на прокси (Nginx, Cloudflare, балансировщик), то внутри сети пароль может передаваться в открытом виде между сервисами.
Ошибки конфигурации приводят к тому, что тела POST-запросов попадают в:
Это создаёт отдельный канал утечки, не связанный с bcrypt.js.
Некоторые системы трассировки могут случайно захватывать payload запросов, включая пароли, если не настроены фильтры маскирования.
Система аутентификации состоит из двух независимых уровней:
Транспортный уровень
Уровень хранения
Ошибка возникает, когда эти уровни смешиваются и bcrypt воспринимается как универсальная защита пароля на всех этапах.
Если рассматривать жизненный цикл пароля:
Любая компрометация на первых двух этапах делает последующие меры защиты несущественными.
При успешном перехвате на транспортном уровне:
Это делает транспортный уровень критическим элементом всей модели безопасности, а не вспомогательной опцией.