Skip to main content

Descripción General

Asegurar tus endpoints de webhook es crítico para garantizar que las solicitudes de webhook provienen de Gu1 y no de actores maliciosos. Esta guía cubre cómo verificar firmas de webhook, implementar mejores prácticas de seguridad y evitar errores comunes de seguridad.

Verificación de Firmas

Gu1 firma todas las solicitudes de webhook con una firma HMAC SHA-256 usando tu secreto de webhook. La firma se envía en el encabezado X-Webhook-Signature, permitiéndote verificar que la solicitud es auténtica.

Cómo Funciona la Verificación de Firmas

  1. Gu1 genera una firma: Al enviar un webhook, Gu1 crea un hash HMAC SHA-256 del cuerpo de la solicitud sin procesar usando tu secreto de webhook
  2. La firma se envía en el encabezado: La firma se incluye en el encabezado X-Webhook-Signature
  3. Tu servidor recalcula: Tu endpoint recalcula la firma usando el mismo secreto y cuerpo sin procesar
  4. Comparar firmas: Si las firmas coinciden, el webhook es auténtico
Siempre verifica las firmas de webhook en producción. Sin verificación, cualquiera puede enviar webhooks falsos a tu endpoint y potencialmente comprometer tu sistema.

Ejemplos de Verificación de Firmas

Node.js (Express)

Node.js
Crítico: Debes verificar la firma usando el cuerpo de solicitud sin procesar antes de que se analice como JSON. Si verificas contra el cuerpo JSON analizado (ej., JSON.stringify(req.body)), la firma no coincidirá porque el formato JSON puede diferir.

Python (Flask)

Python
Usa hmac.compare_digest() en lugar de == para comparar firmas en Python. Esta función realiza una comparación segura contra ataques de tiempo que previene ataques de temporización.

Go (Gin)

Go

Cuerpo Sin Procesar vs JSON Analizado

Un error común es verificar la firma usando el objeto JSON analizado en lugar del cuerpo de solicitud sin procesar. Esto siempre fallará porque el formato JSON puede diferir.

Qué firma Gu1 (y qué no)

Gu1 calcula HMAC-SHA256(secret, raw_request_body) y envía el digest hexadecimal en X-Webhook-Signature.
Usá una comparación timing-safe al validar la firma (por ejemplo crypto.timingSafeEqual en Node.js). Ver la sección de buenas prácticas más abajo.

Historial de webhooks en el dashboard

El monitor de webhooks muestra el payload para debugging y soporte. Esa vista no es el string byte-a-byte que se firmó al momento del envío. Pretty-print, copiar desde la UI o hacer JSON.stringify() sobre un objeto parseado puede generar un string distinto y hacer que un envío correcto parezca inválido. Para depurar un fallo, compará el header X-Webhook-Signature que recibió tu endpoint con el HMAC calculado sobre el raw body de ese mismo request HTTP. No re-verifiques solo con el JSON del dashboard.

Fallos intermitentes de firma

Si la verificación funciona en algunos eventos pero en otros devuelve 401 Invalid signature con el mismo secret y endpoint, las causas habituales son:
  1. JSON parseado y re-serializadoJSON.stringify(req.body) después de express.json() (o equivalente) no reproduce de forma confiable los bytes del body de Gu1. Payloads distintos (orden de keys, forma anidada, formato numérico) pueden fallar solo a veces.
  2. Middleware que muta el body — deduplicar arrays, quitar campos null, ordenar keys o normalizar strings antes de verificar cambia el input firmado.
  3. Secret incorrecto — secret regenerado en el dashboard mientras en tu entorno quedó el valor viejo.
  4. Header de firma ausente — si el webhook no tiene secret configurado, Gu1 puede omitir X-Webhook-Signature; tratar un header faltante como firma inválida es esperable.
La verificación de firma es opcional pero recomendada. Gu1 igual entrega webhooks si no verificás; el 401 lo devuelve tu servidor cuando tu lógica de verificación rechaza el request.

Patrones de Idempotencia

Los webhooks pueden entregarse más de una vez debido a problemas de red, timeouts o reintentos. Implementa idempotencia para asegurar que procesas cada webhook solo una vez.

Idempotencia Basada en Base de Datos

Almacena IDs de webhook procesados en tu base de datos:
Node.js

Idempotencia Basada en Caché

Para webhooks de alto volumen, usa un caché como Redis:
Node.js con Redis
Python con Redis

Mejores Prácticas de Seguridad

Nunca omitas la verificación de firmas en ambientes de producción. Esta es tu defensa principal contra webhooks falsos.
Configura tus endpoints de webhook para usar solo HTTPS. Rechaza solicitudes HTTP:
Solo procesa tipos de eventos que esperas:
Protege tu endpoint del abuso con limitación de tasa:
Nunca hardcodees secretos de webhook. Usa variables de entorno o gestión de secretos:
Para producción, usa un administrador de secretos:
  • AWS Secrets Manager
  • HashiCorp Vault
  • Azure Key Vault
  • Google Secret Manager
Valida la estructura del payload del webhook antes de procesar:
Al comparar firmas, usa funciones de comparación seguras contra tiempo para prevenir ataques de temporización:
Registra todos los intentos de webhook para auditoría y depuración:
Responde con código de estado 200 rápidamente para prevenir reintentos. Procesa trabajo pesado de forma asíncrona:
Si falla el procesamiento del webhook, almacénalo para reintento:

Errores Comunes de Seguridad a Evitar

Evita estos errores comunes de seguridad que pueden comprometer tus endpoints de webhook:

1. Omitir Verificación de Firmas

Riesgo: Cualquiera puede enviar webhooks falsos a tu endpoint.

2. Verificar JSON Analizado en Lugar de Cuerpo Sin Procesar

Riesgo: La verificación de firmas siempre fallará.

3. Usar HTTP en Lugar de HTTPS

Riesgo: Los payloads de webhook pueden ser interceptados en tránsito.

4. Hardcodear Secretos

Riesgo: Secretos expuestos en control de versiones o logs.

5. No Implementar Idempotencia

Riesgo: Webhooks duplicados crearán registros duplicados.

6. Exponer Errores a Clientes

Riesgo: Fuga de información interna a atacantes.

7. No Validar Tipos de Eventos

Riesgo: Atacantes pueden enviar tipos de eventos arbitrarios.

8. Usar Secretos Débiles

Riesgo: Los secretos pueden ser forzados por fuerza bruta. Solución: Usa secretos fuertes, generados aleatoriamente (al menos 32 caracteres).

Probar Seguridad de Webhook

Probar Firmas Inválidas

Probar Ataques de Repetición

Envía el mismo webhook dos veces y verifica idempotencia:

Monitoreo y Alertas

Configura monitoreo para seguridad de webhook:

Próximos Pasos

Configuración de Webhook

Aprende cómo configurar webhooks

Eventos de Entidades

Maneja eventos de ciclo de vida de entidades

Eventos de KYC

Procesa eventos de verificación de KYC

Eventos de Reglas

Responde a reglas de cumplimiento