Cómo verificar firmas digitales en línea
Verifica firmas HMAC, RSA y ECDSA sobre un payload arbitrario con clave pública o secreto compartido — útil para integraciones API, JWT y depuración de webhooks.

Más utilidades que combinan bien con esta guía:
Por qué importa
Cuando el webhook de un proveedor empieza a fallar tu verificación, la causa casi siempre es una de: clave equivocada, algoritmo equivocado, canonicalización equivocada, codificación equivocada. En lugar de meter console.log por todo tu verificador, pega mensaje y firma en un verificador conocido‑bueno y compara resultados. Eso te dice al instante si el bug está en tu código o en el mensaje.
Tres escenarios reales
Pega el JWT, la clave pública, elige RS256/ES256/HS256, ve «válido» o «inválido».
Bug aislado en el handler
Usa la clave pública RSA publicada del proveedor para confirmar la firma del binario.
Procedencia verificada
Firma el payload con el secreto, compara el resultado con la cabecera entrante.
Ruta de código validada
Guía paso a paso
Abre el verificador de firmas.
Pega el mensaje
Los bytes exactos firmados. Para JWT es
header.payload; para AWS Sig V4 es la cadena canónica a firmar.Pega la firma
Hex o Base64 — elige la codificación que coincida con la fuente. La herramienta detecta formatos habituales.
Proporciona la clave
Simétrica: pega la cadena secreta (o su Base64/hex). Asimétrica: pega la clave pública en formato PEM.
Elige el algoritmo
HS256 / HS384 / HS512 (HMAC), RS256 / RS512 (RSA‑PKCS1), PS256 (RSA‑PSS), ES256 / ES384 (ECDSA). Los mismos nombres
algde JWT aplican.Lee el veredicto
«Válido» o «Inválido» con una línea de razón si es inválido (desajuste de algoritmo, error al parsear clave, longitud de firma incorrecta).
Entradas
Message: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyXzEifQ
Signature: L6S8LWkLzpcREMa8gxaaZbWwLNk0LgcBh6dRQpfIBrI
Key: MyVeryLongSharedSecretValue1234567890
Algorithm: HS256Resultado
Valid signature.
Consejos útiles
- Prueba siempre con vectores de referencia del proveedor. La mayoría publica un par mensaje + firma conocido que puedes pegar para confirmar que la herramienta maneja su algoritmo exacto.
- Para JWT, copia el encabezado para confirmar que
algcoincide con lo que espera tu verificador. Ignora tokens sin firma (alg=none) — es vector de ataque. - Usa PSS en nuevos diseños RSA. PKCS#1 v1.5 (RS256) está bien pero la comunidad criptográfica favorece RSASSA‑PSS (PS256).
- Cuidado con la cadena canónica. Diferencias sutiles (un
\nfaltante, nombre de cabecera en minúsculas) cambian la firma. Haz diff contra una captura que funcione para encontrarlas.
Trampas comunes
Error frecuente
Clave pública en formato equivocado
Las claves PEM vienen como BEGIN PUBLIC KEY (SPKI) y BEGIN RSA PUBLIC KEY (PKCS#1). La herramienta acepta ambas, pero asegúrate de pegar la clave pública (no el certificado, no la privada).
Error frecuente
La firma es Base64URL pero se parsea como Base64
Las firmas JWT usan Base64URL (sin relleno, alfabeto -_). Configura la codificación de entrada en consecuencia o normaliza manualmente.
Error frecuente
Desajuste en nombre de algoritmo
«sha256WithRSAEncryption» en OpenSSL es lo mismo que «RS256» en JWT. Elige el alias correcto en el desplegable.
Cuándo no es la herramienta adecuada
- Emitir certificados corresponde a OpenSSL o tu CA.
- Verificar certificados TLS del servidor es trabajo del navegador; la validación de cadena es mucho más compleja que una sola comprobación de firma.
- Firma de binarios de plataforma (Windows Authenticode, Apple Developer ID) requiere herramientas específicas de plataforma.
Preguntas frecuentes
¿Puedo verificar un webhook de Stripe / GitHub aquí?
Sí. Usa HS256 (HMAC‑SHA‑256), el secreto de tu panel, la cadena del cuerpo crudo y el valor de cabecera como firma. El resultado indica si la petición fue manipulada.
¿Soporta Ed25519?
La verificación Ed25519 está en la hoja de ruta. Por ahora usa CLI tipo openssl pkeyutl -verify.
¿Se envía mi clave a un servidor?
No. WebCrypto corre localmente; las claves no salen del proceso del navegador.
Próximos pasos
- Calcula el lado HMAC en el generador HMAC.
- Hashea el payload por separado si tu protocolo apila HMAC sobre hash de cuerpo con el generador de hash.
- Decodifica segmentos JWT con la herramienta Codificar/Decodificar antes de pegar el mensaje en el verificador.