Ir al contenido

Glosario

Firma del webhook

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. Las solicitudes a la API se firman en sentido contrario, con tu clave API; consulta autenticación de la API.

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)

En la documentación →

Términos relacionados

Empieza con un pago de prueba

Crea una cuenta, pide a soporte el entorno de prueba y mira cómo un pago pasa de pending a paid en una red de prueba.