Метод bcrypt.compareSync используется для синхронного
сравнения открытого пароля с ранее захешированным значением. Он
выполняет проверку совпадения без асинхронного ожидания и блокирует
поток выполнения до завершения операции.
С точки зрения безопасности алгоритм остаётся тем же, что и в асинхронных методах: применяется bcrypt-хеширование с солью и параметром стоимости (cost factor). Разница заключается исключительно в модели выполнения.
compareSyncВнутренний процесс проверки включает несколько этапов:
Из переданного хеша извлекаются параметры:
Открытый пароль повторно хешируется с использованием тех же параметров.
Результат нового хеширования сравнивается с исходным хешем.
Возвращается булево значение:
true — пароль совпадаетfalse — пароль неверенФактически происходит повторное вычисление bcrypt-хеша, а не простое сравнение строк.
const bcrypt = require('bcryptjs');
const password = 'mySecretPassword';
// заранее сохранённый хеш (обычно хранится в базе данных)
const hash = '$2a$10$K7QJ1zq8v9x1nQ9dQ0l3Feu8b1w8V0v1xXzYzQmQmQmQmQmQmQmQ';
// синхронная проверка
const isMatch = bcrypt.compareSync(password, hash);
console.log(isMatch); // true или false
compareSync работает в блокирующем режиме. Это означает,
что поток Node.js останавливается до завершения вычислений.
Блокировка возникает из-за того, что bcrypt:
В среде Node.js синхронные операции bcrypt напрямую влияют на производительность приложения.
При использовании compareSync:
Это особенно критично в веб-серверах и API.
| Характеристика | compareSync | compare (async) |
|---|---|---|
| Выполнение | синхронное | асинхронное |
| Блокировка event loop | да | нет |
| Производительность | ниже при нагрузке | выше |
| Простота | выше | требует callback/Promise |
compareSyncСинхронная проверка оправдана только в ограниченных сценариях:
В серверных приложениях использование синхронной версии приводит к деградации масштабируемости.
app.post('/login', (req, res) => {
const match = bcrypt.compareSync(req.body.password, user.hash);
res.send(match);
});
Проблема заключается в блокировке обработки других запросов во время вычисления.
Слишком низкое значение cost factor снижает время хеширования, но уменьшает устойчивость к brute-force атакам.
bcrypt уже включает соль и защиту от rainbow table атак, повторные проверки или кэширование результата сравнения не дают выигрыша в безопасности.
bcrypt использует алгоритм EksBlowfish, в котором:
compareSync фактически вызывает ту же криптографическую
процедуру, что и hashSync, но с уже заданной солью.
Время выполнения резко зависит от cost factor:
Каждое увеличение cost на 1 примерно удваивает время вычисления.
compareSync в веб-серверах с
высокой нагрузкойbcrypt.compareПри несовпадении bcrypt всё равно выполняет полное вычисление хеша. Это сделано намеренно для защиты от timing attacks, поскольку время выполнения не зависит от частичного совпадения строк.
compareSync может выбрасывать исключения в случаях:
try {
const result = bcrypt.compareSync(password, hash);
} catch (err) {
console.error('Ошибка проверки пароля:', err.message);
}
С точки зрения безопасности compareSync не уступает
асинхронной версии. Различие исключительно в модели исполнения, а не в
криптографическом алгоритме.
Основные свойства: