Decodificar y verificar JWT (HS256 / HS384 / HS512)
CifradoTodo se ejecuta en tu navegador: no se sube nada
Divide un JWT en su cabecera, payload y firma, formatea los tres y convierte los claims iat, nbf y exp en fechas legibles con un indicador claro de caducidad. Esta herramienta también puede verificar una firma HS256 / HS384 / HS512 con un secreto que le des — si el secreto y la firma concuerdan, el contenido firmado con ese secreto no se ha alterado. ⚠️ Tres cosas por delante. Primero, nunca pegues un secreto de producción. Aquí todo se ejecuta en local y no se sube nada, pero pegar una clave de producción en una página web ya es un mal hábito: usa un secreto de prueba. Segundo, un token cuyo alg sea none debe tratarse como inválido cuando se da un secreto — la vulnerabilidad clásica de JWT. Tercero, una firma verificada no significa que el token siga siendo válido — mira exp, nbf, aud e iss; la herramienta informa de la caducidad y de nbf por separado. Sin secreto solo decodifica, y signatureVerification dice not-performed. El payload es texto plano (Base64URL es una codificación, no un cifrado), así que deja fuera contraseñas y demás secretos.
Funciones
- ⚠️ Nunca uses un secreto de producción — usa uno de prueba (todo se ejecuta en local, pero pegar una clave de producción en una página es el mal hábito)
- Verifica firmas HS256 / HS384 / HS512 con tu secreto, con una comparación en tiempo constante que no retorna con un prefijo coincidente
- ⚠️ Un token con alg none es inválido en cuanto se da un secreto (la vulnerabilidad clásica de JWT)
- ⚠️ Una firma verificada solo significa que el contenido no se alteró — no que el token siga siendo válido; exp y nbf se informan, aud e iss son cosa tuya
- Sin secreto solo decodifica, y así lo dice la salida
- El secreto puede ser texto UTF-8 o Base64 (muchas claves se exportan en Base64)
- Divide y formatea la cabecera, el payload y la firma
- Convierte iat, nbf y exp a marcas de tiempo ISO e informa de caducidad y de «aún no válido»
- Acepta Base64URL sin relleno, el prefijo Bearer y tokens partidos en varias líneas
- Explica un número de segmentos incorrecto, y reporta un token de 5 partes como JWE cifrado y no como JWT
- Tamaño del token y si los servidores habituales lo rechazarían: nginx 8 KB por línea, Apache 8190, IIS 16384, Node 16 KB, Go 1 MB
Cómo se usa
- Pega el token, con prefijo Bearer o sin él
- Para verificar, escribe el secreto y elige texto UTF-8 o Base64; déjalo vacío para solo decodificar
- Lee el veredicto de verificación, los tres segmentos y las marcas de tiempo
- Pulsa Copiar para llevarte el resultado — una firma verificada sigue sin significar que el token sea válido
Preguntas frecuentes
- ¿Es seguro pegar mi secreto aquí?
- ⚠️ No uses un secreto de producción. Todo el cálculo ocurre en tu navegador y el secreto nunca se sube (sigue funcionando sin conexión una vez cargada). El problema no es la transmisión sino la costumbre: pegar una clave de producción en una página web, donde queda en el historial o el portapapeles, es algo que no deberías hacer. Usa un secreto de prueba dedicado para ver cómo se comporta la herramienta.
- La firma se verificó, así que el token es válido, ¿no?
- No. Una firma verificada solo significa que el contenido firmado con ese secreto no se alteró. Que el token siga sirviendo depende además de exp (¿caducado?), nbf (¿ya vigente?), aud e iss (¿para quién, de quién?) — la herramienta informa de exp y de nbf, mientras que aud e iss son cosa tuya. Además, esta herramienta solo verifica HS256 / HS384 / HS512 simétricos; RS256 y ES256 necesitan clave pública y quedan fuera de su alcance.
- ¿Qué pasa si el alg es none?
- Se trata como inválido cuando se da un secreto. Es la vulnerabilidad clásica de JWT: el atacante pone alg en none y quita la firma, y una implementación ingenua que se salta la verificación para none acepta cualquier token falsificado. Esta herramienta trata «secreto dado + alg none» como fallo de verificación, no como un salto.
- ¿El secreto va como texto o en Base64?
- Un secreto HMAC es una secuencia de bytes, y los bytes tienen más de una escritura. Valores al estilo jwt.io como `your-256-bit-secret` se usan como texto UTF-8, así que elige texto UTF-8. Si tu clave es una cadena Base64 que te dieron (una clave binaria exportada de un archivo de configuración o un gestor), elige Base64 y la herramienta la decodifica a bytes antes de verificar — las dos opciones producen firmas totalmente distintas, y la equivocada falla.
- ¿El payload está cifrado?
- No. Base64URL es una codificación, no un cifrado, así que quien tenga el token puede leer todo lo que lleva dentro — que es justo lo que hace esta herramienta. Nunca pongas contraseñas, teléfonos ni números de identidad en un payload JWT. Si necesitas confidencialidad, usa JWE, que produce un token de 5 partes que esta herramienta no sabe leer.
- ¿Qué reloj decide si ha caducado?
- El tuyo. El indicador de caducidad compara exp con la hora de tu equipo, así que un reloj mal puesto da una respuesta equivocada. La comprobación de caducidad que manda pertenece siempre al servidor, porque el reloj del cliente se puede poner en cualquier cosa.
Herramientas relacionadas
Base64
CifradoConvierte texto a Base64 y al revés, con UTF-8 correcto para acentos, chino y emoji. Todo se ejecuta en tu navegador: no se sube nada.
Formateador JSON
FormatoFormatea, valida y repara JSON en línea: árbol plegable, búsqueda de claves y valores, edición nodo a nodo y errores con línea y columna.
Conversor de timestamp
ConversiónConvierte marcas de tiempo Unix en fechas y al revés, con segundos, milisegundos, microsegundos, nanosegundos, FILETIME y zonas horarias.
Codificar URL
CifradoEscapa texto a la forma %XX y lo devuelve, tratando una URL completa y un valor de parámetro como trabajos distintos. Todo en tu navegador.
Entidades HTML
CifradoConvierte < > & y las comillas en entidades HTML y las devuelve en una sola pasada, así que &lt; da <, no un ángulo. En tu navegador.
Escape Unicode
CifradoConvierte texto no ASCII y emoji en escapes \uXXXX o \xXX y los devuelve, con los emoji escritos como pares suplentes correctos. En tu navegador.