Сравнение секретов и timing attack
Вопрос
Вебхук платёжной системы подписан HMAC. Сервис проверяет if (signature === expected). В чём проблема и как правильно?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Проблемы нет,
===для строк работает за постоянное время ===выходит на первом несовпадении; нуженcrypto.timingSafeEqualправильный ответ- Нужно сравнивать через
==, чтобы учесть разные типы - Хешировать обе строки MD5 и сравнить хеши через
===
Разбор
Посимвольное сравнение с ранним выходом теоретически позволяет подбирать подпись по байту, измеряя время ответа. По сети эффект мал, но защита стоит одну строку: crypto.timingSafeEqual(Buffer.from(a), Buffer.from(b)). Важная деталь: функция бросает исключение при разной длине буферов, поэтому длину проверяют заранее (длина подписи не секрет) или сравнивают HMAC от обеих строк.
== только добавляет приведение типов. Хеширование MD5 перед === сильно усложняет атаку (атакующий не управляет префиксом хеша), но это обходной путь, а не стандартное решение; стандарт это timingSafeEqual.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Безопасность бэкенда»
- Безопасный INSERT: параметры и белый список колонок
- CORS: проверка Origin по белому списку
- Проверка claims JWT после подписи
- deepMerge без prototype pollution
- Rate limiter на token bucket
- Кто превысил лимит запросов: скользящее окно
- Код-ревью: регистрация, вход и сброс пароля
- Как защитить Node.js API