Выбор ответа Middle Безопасность бэкенда обновлено

Сравнение секретов

Вопрос

Сервис проверяет подпись вебхука: if (signature === expected). В чём риск и чем заменить?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Атака по времени; заменить на crypto.timingSafeEqual. Обычное сравнение строк прерывается на первом отличающемся символе.

Варианты ответа

  1. Риска нет, === сравнивает строки за постоянное время
  2. Нужно == вместо ===, чтобы не зависеть от типа
  3. Атака по времени; заменить на crypto.timingSafeEqualправильный ответ
  4. Нужно сравнивать через localeCompare с локалью

Разбор

Обычное сравнение строк прерывается на первом отличающемся символе. Измеряя время ответа, можно подбирать подпись по символу. timingSafeEqual сравнивает за время, не зависящее от содержимого. Буферы должны быть одной длины, иначе он бросит ERR_CRYPTO_TIMING_SAFE_EQUAL_LENGTH, поэтому длину проверяют заранее.

  • === не гарантирует постоянного времени.
  • == и localeCompare ведут себя так же или хуже.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме