Saltar al contenido

Inspeccionar JWT y firmar o verificar tokens HMAC

Pega un token o introduce un contenido y secreto de prueba para crearlo. Una firma válida no sustituye los controles de emisor, audiencia y autorización.

Se ejecuta localmente en tu navegador
Token
Claim checks
Algorithm—
Expiration—
Not before—
Issuer—
Cabecera decodificada
Inspect a token to view its header.
Decoded payload
Inspect a token to view its payload.
Verify an HMAC signature

El secreto solo se utiliza en la API criptográfica del navegador. El verificador admite HS256, HS384 y HS512 y no envía el token ni el secreto a VoriTools.

Inspecciona un JWT firmado e introduce el secreto HMAC correspondiente para verificarlo.
Genera un JWT HMAC local

Genera únicamente tokens HS256, HS384 o HS512. El payload y el secreto permanecen en Web Crypto; esta herramienta nunca ofrece alg: none.

Generate a local HMAC JWT to view it here.

JWT inspection is not authentication

Los claims decodificados son datos Base64URL legibles, no una prueba de confianza. Comprueba algoritmo, caducidad, issuer y audience y verifica la firma con una clave o secreto de confianza antes de aceptar el token.

Cómo inspeccionar y verificar un JWT

Esta página divide un JWT compacto en su cabecera, su payload y su firma, muestra los claims decodificados y verifica la firma cuando el token está firmado con HMAC y facilitas el secreto. También genera tokens HS256, HS384 o HS512 de vida corta a partir de un payload que escribes tú.

Decodificar y verificar son dos pasos separados a propósito. Cualquiera puede leer el payload de un JWT sin clave, y una firma válida solo demuestra que el token se firmó con esa clave; no dice si ha caducado, si se emitió para tu servicio ni qué permite hacer.

  1. Pega el token en formato header.payload.signature en el campo del token y pulsa Inspeccionar token, o pulsa Cargar ejemplo para obtener una muestra firmada.
  2. Lee la cabecera decodificada (algoritmo, tipo y kid) y después el payload decodificado. La franja de comprobaciones muestra algoritmo, caducidad, no antes de y emisor antes del JSON en bruto.
  3. Para verificar un token HMAC elige HS256, HS384 o HS512 en Algoritmo, introduce el secreto compartido y pulsa Verificar firma.
  4. Para crear un token de prueba elige el algoritmo, pega un objeto JSON en Payload, ajusta Caducidad en minutos y, si quieres, añade el claim iat; después pulsa Generar JWT local.
  5. Usa Copiar cabecera o Copiar payload para llevarte el JSON decodificado, e Inspeccionar el token generado para pasar un token recién creado al inspector.

Estructura del JWT, algoritmos y claims

Qué contiene cada una de las tres partes

La cabecera es JSON codificado en Base64URL que normalmente declara alg y typ, y a veces un kid que indica al verificador qué clave usar. El payload es el conjunto de claims: los registrados (iss, sub, aud, exp, nbf, iat, jti) más los privados que añade el emisor. La firma es el algoritmo aplicado a la cadena ASCII base64url(header) + "." + base64url(payload) con la clave.

Base64URL es el alfabeto Base64 estándar con + y / sustituidos por - y _ y sin relleno. Por eso un token viaja en una URL, una cookie o una cabecera Authorization sin escapes, y por eso reconstruir el token a mano suele romper la firma.

Qué algoritmos puede verificar esta página

Solo la familia HMAC: HS256, HS384 y HS512, porque basta un secreto compartido para recalcularlas. RS256, PS256, ES256 y EdDSA firman con clave privada y verifican con clave pública, así que aquí se pueden decodificar pero no verificar; para eso necesitas la JWK pública del emisor. Con un token RS256 el botón Verificar firma queda desactivado y el aviso lo explica.

Un token que declare alg como none se marca en rojo: nunca debe aceptarse, y un verificador jamás debería fiarse del algoritmo que anuncia el propio token sin contrastarlo con una lista permitida. Sustituir HS256 por RS256 y firmar con la clave pública como si fuera un secreto HMAC es un ataque conocido contra librerías descuidadas.

Claims que conviene revisar antes de aceptar un token

exp debe estar en el futuro y nbf en el pasado, en segundos desde la época Unix, con algo de margen entre relojes. iat debe ser verosímil, no futuro. iss y aud tienen que coincidir con tu servicio; si no, se aceptará un token emitido para otra aplicación.

Comprobar la firma no es autorizar. Los roles, los permisos y el identificador de inquilino viven en claims privados, y el conjunto de claims de un JWT va firmado pero no cifrado: nunca pongas un secreto en un payload que no enseñarías a quien tiene el token.

Dudas sobre la firma y los claims de un JWT

¿Es seguro pegar un token en esta página?

La decodificación y la verificación HMAC se ejecutan en tu navegador, así que el token no se sube. Aun así, lo prudente es probar con tokens de usar y tirar: un refresh token de producción o una credencial de larga vida no deberían pegarse en ninguna página web, tampoco en esta.

¿Por qué falla la verificación de mi token RS256 o ES256?

Esos algoritmos son asimétricos y esta página solo recalcula firmas HMAC. El token se puede decodificar y sus claims leer, pero verificarlo exige la clave pública del emisor y una librería que soporte JWA, algo que una página en el navegador con un secreto compartido no puede hacer correctamente.

La firma dice que no es válida. ¿Qué significa?

O el secreto no es el correcto, o el algoritmo elegido no coincide con el de la cabecera, o el texto del token cambió después de firmarse. Editar el payload, reindentarlo y volver a codificarlo a mano da el mismo resultado, porque la firma cubre los bytes originales exactos.

¿Por qué puedo leer el payload sin clave?

Porque un JWT va firmado, no cifrado. Base64URL es una codificación y cualquiera que tenga el token puede decodificar cabecera y payload sin ninguna clave. Si los claims son sensibles, usa JWE, que cifra el contenido para un destinatario.

¿En qué se diferencian un JWT, un JWS y un JWE?

JWT es el conjunto de claims, los datos. JWS es la serialización firmada que produce el token compacto de tres partes que inspecciona esta página. JWE es la serialización cifrada, donde el payload no se puede leer sin clave y la estructura tiene cinco partes en lugar de tres.

¿Cuánto debería durar un token de prueba generado?

Minutos, no horas. Pon Caducidad en minutos en un valor pequeño para que un token de prueba filtrado deje de servir, y recuerda que esta página firma con el secreto que escribes en local, así que el token solo vale para sistemas que compartan ese secreto.

Herramientas recientes: