HMAC-подпись для хуков: без неё входящий запрос — просто шум в сети
Смотрим в тело запроса и не доверяем заголовку «по умолчанию». Правильная схема простая: получаем raw body, считаем HMAC на стороне приёма, сравниваем с подписью из header. Если провайдер шлёт `sha256=...`, не надо «почти такой же» строковый compare — только константное время, иначе ловите timing side-channel на ровном месте.
Критичные правила:
• raw body должен быть бит-в-бит тем же, что подписал отправитель; любое перепарсивание JSON ломает проверку
• секрет хранится отдельно от кода, ротация — через несколько активных ключей
• сверяем не только подпись, но и timestamp/nonce, иначе replay-атака проходит как «валидный» дубль
import hmac, hashlib
sig = hmac.new(secret, raw_body, hashlib.sha256).hexdigest()
ok = hmac.compare_digest(sig, recv_sig)
На практике ошибки обычно банальны: прокси режет тело, фреймворк уже распарсил JSON, а хендлер сравнивает не тот формат подписи. Ещё хуже — когда 200 OK отдаётся до проверки: злоумышленник получает бесплатный квиток, а вы потом чистите мусор асинхронно.
Идемпотентность — это не роскошь, а база: даже валидный хук может прилететь повторно. Храните event_id, дедуплицируйте, а при невалидной подписи отвечайте 401/403 без лишней болтовни. Ретрай-политика решает всё, если ваш провайдер упрямо стучится повторно.
Автоматизация на вебхуках
@webhook_automation_hub_arb
HMAC-подпись для хуков: без неё входящий запрос — просто шум в сети
Этот пост опубликован в Telegram-канале Автоматизация на вебхуках. Подписаться можно по ссылке: @webhook_automation_hub_arb.