Выбор ответа Senior Сессии и безопасность обновлено
Сравнение секретов
Вопрос
Почему API-токен из заголовка сравнивают через hash_equals($stored, $given), а не ===?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: === выдаёт совпадение префикса по времени, hashequals нет. Атака по времени (timing attack) измеряет, насколько дольше отвечает сервер, когда начало токена совпадает. hashequals сравнивает все байты всегда, поэтому время не выдаёт совпадение.
Варианты ответа
===не умеет сравнивать строки длиннее 32 символовhash_equalsхеширует строки перед сравнением и потому надёжнее- Разницы нет, это вопрос стиля и единообразия кода
===выдаёт совпадение префикса по времени,hash_equalsнетправильный ответ
Разбор
Атака по времени (timing attack) измеряет, насколько дольше отвечает сервер, когда начало токена совпадает. hash_equals сравнивает все байты всегда, поэтому время не выдаёт совпадение. Сам он ничего не хеширует, несмотря на имя. Ещё лучше хранить в базе хеш токена и сравнивать хеши, тогда утечка базы не раскроет токены.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.