Skip to main content
Cada evento incluye un header X-Ryvo-Signature con esta estructura:
  • t — timestamp Unix en segundos cuando firmamos el evento.
  • v1 — hexadecimal del HMAC-SHA-256 de ${t}.${body_raw} usando tu signing secret.

Cómo verificar

1

Lee el header

Parsea X-Ryvo-Signature y extrae t y v1.
2

Reconstruye la firma esperada

Computa HMAC-SHA-256(secret).update(t + '.' + raw_body).digest('hex'). Usa el body crudo (string), no JSON parseado y reserializado.
3

Compara constant-time

Usa una comparación constant-time (no ===) para evitar timing attacks.
4

Verifica el timestamp

Rechaza eventos con t más viejo que 5 minutos para mitigar replay attacks.

Snippets

Errores comunes

El HMAC tiene que correrse contra el body crudo (string original). Si parseas y reserializas, el JSON puede salir con otro espaciado y la firma deja de coincidir.
=== o strcmp corta el loop al primer byte distinto, lo que filtra info por timing. Usa crypto.timingSafeEqual (Node), hmac.compare_digest (Python), hmac.Equal (Go).
Sin tolerancia de timestamp, un atacante que capture un evento legítimo puede replayarlo días después. Rechaza eventos con t más viejo que 5 minutos.
Algunos frameworks (Next.js API routes, NestJS) parsean el body antes de pasarlo al handler. Configura tu ruta para acceder al raw body antes del JSON parse.