# Firma del webhook

> Un hash con clave que prueba que un webhook viene de la plataforma y no fue alterado. Cómo verificar el encabezado X-Signature de CryptoLike sobre el cuerpo crudo.

Source: https://cryptolike.net/es/glossary/webhook-signature
Updated: 2026-09-25

Un hash con clave, enviado en un encabezado de la solicitud, que prueba que un evento viene de quien tiene un secreto compartido y que su cuerpo no cambió en el camino.

## Cómo funciona en CryptoLike

CryptoLike firma cada webhook con el secreto de tu endpoint: `X-Signature` es `sha256=` seguido del HMAC-SHA256 en hexadecimal de `X-Timestamp`, un punto y el cuerpo crudo de la solicitud. Tu servidor calcula el mismo valor, lo compara en tiempo constante y rechaza la solicitud si no coinciden o si `X-Timestamp` se aleja más de 300 segundos de su reloj, hacia adelante o hacia atrás. Así una solicitud capturada no se puede reenviar.

Verifica los bytes crudos tal como llegaron, nunca un JSON vuelto a serializar: el orden de las claves y los espacios pueden diferir de lo que produciría tu parser. Un evento reintentado trae el mismo cuerpo con `X-Timestamp` y `X-Signature` nuevos. El secreto lo genera CryptoLike (64 caracteres hexadecimales) o lo defines tú (de 16 a 256 caracteres ASCII imprimibles, sin espacios); se muestra una sola vez, al crearlo y al rotarlo, se queda en tu servidor y puedes rotarlo en el panel en cualquier momento.

Los SDK de CryptoLike para TypeScript, Python, Go y PHP verifican un webhook con una sola llamada, con la comparación en tiempo constante y la tolerancia de la marca de tiempo incluidas. Los vectores de prueba, con solicitudes que tu verificador debe rechazar, se publican junto con el [contrato de webhooks](https://cryptolike.net/docs/webhooks). Las solicitudes a la API se firman en sentido contrario, con tu clave API; consulta [autenticación de la API](https://cryptolike.net/docs/auth).

## Ejemplo

Verificar una firma de CryptoLike requiere cuatro datos: el secreto del endpoint, el encabezado `X-Timestamp`, los bytes crudos del cuerpo y el encabezado `X-Signature`. En Python son unas pocas líneas con la biblioteca estándar; llama a la función antes de interpretar o guardar el evento:

```python
import hmac, hashlib

def verify(secret: str, timestamp: str, raw_body: bytes, signature: str) -> bool:
    expected = "sha256=" + hmac.new(secret.encode(), f"{timestamp}.".encode() + raw_body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, signature)
```
