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:
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)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.