Score webhook authenticity controls — signature algorithm, secret entropy, timestamp tolerance, replay cache and constant-time compare.
Forgery resistance is the weaker of the algorithm and the secret — HMAC-SHA256 over a 32-bit secret is a 32-bit problem — so the two are combined before scoring. A signature alone is not enough: without a timestamp and a replay cache, a captured delivery can be resent, which is why those two terms carry 36 points between them. A webhook endpoint is an unauthenticated write path into your system, and the usual failures are comparing signatures with == and accepting any timestamp.
Webhook Verification
Verification score = 30 for ≥128-bit forgery resistance + timestamp tolerance score (20 at ≤60 s down to 0 above 15 min) + 16 replay cache + 12 constant-time compare + rotation score (10 at ≤90 days) + 8 TLS verification + 4 per-endpoint secret = 100.
Replay window
replayable events = timestamp tolerance × peak delivery rate, when no replay cache is present.
Verification score = 30 for ≥128-bit forgery resistance + timestamp tolerance score (20 at ≤60 s down to 0 above 15 min) + 16 replay cache + 12 constant-time compare + rotation score (10 at ≤90 days) + 8 TLS verification + 4 per-endpoint secret = 100. Forgery resistance is the weaker of the algorithm and the secret — HMAC-SHA256 over a 32-bit secret is a 32-bit problem — so the two are combined before scoring. A signature alone is not enough: without a timestamp and a replay cache, a captured delivery can be resent, which is why those two terms carry 36 points between them.
A webhook endpoint is an unauthenticated write path into your system, and the usual failures are comparing signatures with == and accepting any timestamp.
This calculator takes 9 inputs: Signature algorithm, Shared secret entropy, Timestamp tolerance, Replay cache keyed on event ID or signature, Constant-time signature comparison, TLS certificate verification on delivery, Unique secret per endpoint, Secret rotation interval, Peak delivery rate. The pre-filled defaults are a realistic starting point — replace them with figures from your own environment for a result you can act on.
Because a valid signature stays valid forever. Anyone who captures one delivery — from a log, a proxy or a misrouted request — can resend it repeatedly. Signing a timestamp alongside the body and rejecting anything older than a few minutes bounds that window, and a replay cache on the event ID closes it.