HMAC podpis
HMAC podpis je otisk zprávy vypočítaný hashovací funkcí (typicky SHA-256) ze sdíleného tajného klíče a obsahu, kterým příjemce webhooku ověří, že požadavek skutečně poslala služba a tělo nebylo změněno.
Služba spočítá HMAC-SHA256(secret, tělo požadavku) a pošle ho v hlavičce; aplikace spočítá totéž ze syrového těla (před parsováním JSON, protože i změna pořadí klíčů nebo mezer podpis rozbije) a porovná funkcí s konstantním časem (timingSafeEqual, hash_equals, hmac.compare_digest). Nerovnost znamená podvržený nebo poškozený požadavek, který je třeba odmítnout.
Proti opakovanému přehrání zachyceného požadavku pomáhá časové razítko zahrnuté do podepisovaného řetězce a ID události; webhook starší než několik minut aplikace odmítne. Tajný klíč držte mimo kód (proměnná prostředí) a při úniku ho rotujte.
// Node.js
const sig = crypto.createHmac("sha256", SECRET).update(rawBody).digest("hex")
const ok = crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(headerSig))Webhooky TopEmail nesou HMAC-SHA256 podpis v hlavičce X-TopEmail-Signature; ukázky ověření v Node.js, PHP a Pythonu najdete v návodech na blogu.