Pega el cuerpo original y el secreto para generar o verificar su firma HMAC. Incluye formatos GitHub y Stripe; una firma válida no comprueba la vigencia del timestamp ni evita la repetición de eventos.
Se ejecuta localmente en tu navegadorEnter a secret and payload to generate a signature.
Generate a signature to see the corresponding request header.
Generate a signature to see Node.js and PHP verification patterns.
La verificación de webhooks falla si el middleware analiza o reformatea el body antes de comprobarlo. Conserva el body original, aplica la entrada de firma documentada por el proveedor y usa una comparación de tiempo constante en el servidor. Esta página no envía el payload ni el secreto.
Firma el cuerpo exacto que pegas con HMAC-SHA-256, SHA-384 o SHA-512, reproduce los formatos X-Hub-Signature-256 de GitHub y v1 de Stripe, y compara una firma recibida byte a byte con el mismo secreto.
El cálculo se hace en esta pestaña con Web Crypto. El cuerpo, el secreto y las firmas no salen del navegador; una coincidencia confirma los bytes, no la antigüedad del evento.
HMAC genérico firma el cuerpo original. GitHub firma ese mismo cuerpo y envía sha256=<hex> en X-Hub-Signature-256. Stripe firma la cadena <timestamp>.<cuerpo> y envía t=<timestamp>,v1=<hex> en Stripe-Signature.
Al pegar una cabecera de Stripe, el t de la cabecera forma la entrada firmada; el campo de marca de tiempo solo se usa si la cabecera no trae t=. Con secretos rotados puede haber varios v1, y la comprobación pasa si coincide cualquiera.
El área de texto convierte los CR y CRLF pegados en LF. Si el emisor firmó bytes CRLF, activa Firmar con saltos de línea CRLF: cada LF se reconstruye como CRLF antes de calcular el HMAC.
Cualquier diferencia textual importa: un JSON reserializado, un salto de línea final eliminado, un espacio cambiado, un componente de URL decodificado o leer el cuerpo ya parseado dan otro resumen. Copiar solo la parte hexadecimal de una cabecera elimina el prefijo sha256= o v1= que espera el formato, aunque la herramienta acepta las dos formas.
La verificación solo compara bytes HMAC. No rechaza marcas de tiempo antiguas ni eventos repetidos, no conoce la ventana de tolerancia del proveedor y no contacta con el emisor.
Base64 se acepta en webhooks genéricos; GitHub y Stripe transmiten hexadecimal, así que para ellos no se ofrece verificación en base64. Rotar o revocar un secreto filtrado sigue siendo una tarea del servidor.