Codificador JWT

Crea y firma JSON Web Tokens con HS256, HS384, HS512

Encabezado

Se ejecuta localmente · Es seguro pegar secretos

Carga útil

Se ejecuta localmente · Es seguro pegar secretos

Clave secreta

Se ejecuta localmente · Es seguro pegar secretos

JWT codificado

Output will appear here…

Tu clave secreta nunca sale de tu navegador. Toda la firma ocurre en el lado del cliente.

También prueba:Decodificador JWT

¿Qué es la codificación JWT?

La codificación JWT es el proceso de crear un JSON Web Token (JWT) — una cadena compacta y segura para URLs que contiene un conjunto de afirmaciones firmadas con una clave criptográfica. El resultado es un token de tres partes (header.payload.signature) definido por RFC 7519 que los servidores pueden verificar sin mantener estado de sesión. La codificación JWT en línea te permite crear y firmar tokens directamente en tu navegador para pruebas y desarrollo.

El encabezado declara el algoritmo de firma (p. ej. HS256) y el tipo de token. La carga útil contiene afirmaciones — pares clave-valor como el asunto (sub), tiempo de vencimiento (exp) y cualquier dato personalizado que tu aplicación necesite. Ambas partes se serializan como JSON, luego se codifican en base64url. La firma se calcula sobre el encabezado y la carga útil codificados usando una clave secreta, vinculando los tres segmentos.

A diferencia de las cookies de sesión, los JWT son autocontenidos: el verificador no necesita consultar una base de datos ni llamar a un servicio externo. Esto hace que la autenticación basada en JWT sea popular en APIs REST, microservicios y aplicaciones de una sola página donde la autorización sin estado reduce la latencia y simplifica el escalado horizontal.

¿Por qué usar un codificador JWT?

Generar JWTs a mano requiere codificación base64url, serialización JSON y cálculo HMAC. Esta herramienta maneja los tres pasos al instante para que puedas enfocarte en obtener las afirmaciones correctas.

Generación de tokens instantánea
Edita el encabezado, la carga útil y la clave secreta — el JWT firmado se actualiza en tiempo real. Sin pasos de compilación, sin instalación de bibliotecas, sin código redundante.
🔒
Múltiples algoritmos HMAC
Cambia entre HS256, HS384 y HS512 con un clic. El encabezado se actualiza automáticamente y la firma se recalcula al instante.
🛡️
Procesamiento con privacidad primero
Toda la firma ocurre en tu navegador usando la API Web Crypto. Tu clave secreta y datos de carga útil nunca salen de tu máquina — sin servidor, sin registros, sin riesgo.
📋
Ayudantes de afirmaciones con un clic
Agrega marcas de tiempo iat, exp+1h o exp+24h con un solo botón. Sin necesidad de calcular marcas de tiempo Unix manualmente ni buscar la hora de época actual.

Casos de uso del codificador JWT

Pruebas de autenticación del frontend
Genera tokens con afirmaciones y tiempos de vencimiento específicos para probar flujos de inicio de sesión, lógica de actualización de tokens y guardias de rutas protegidas sin ejecutar un servidor de autenticación backend.
Desarrollo de API backend
Crea tokens de prueba con afirmaciones sub, aud y scope personalizadas para ejercitar middleware de autorización, control de acceso basado en roles y verificaciones de permisos durante el desarrollo local.
Canalizaciones DevOps y CI/CD
Genera tokens de corta duración para scripts de implementación, pruebas de integración o comunicación entre servicios donde un flujo OAuth completo sería innecesariamente complejo.
Pruebas de QA y manuales
Construye tokens con afirmaciones de casos extremos — tokens vencidos, campos faltantes, audiencias incorrectas — para verificar que tu API devuelve las respuestas correctas HTTP 401 o 403.
Auditoría de seguridad
Crea tokens firmados con diferentes algoritmos y longitudes de clave secreta para validar que tu lógica de verificación rechaza correctamente firmas débiles o que no coinciden.
Aprendizaje y prototipado
Estudiantes y desarrolladores nuevos en JWT pueden experimentar con campos de encabezado, estructuras de afirmaciones y algoritmos de firma para entender cómo funciona cada parte del token.

HS256 vs HS384 vs HS512: Comparación de algoritmos HMAC

Los tres algoritmos usan HMAC (Código de Autenticación de Mensajes Basado en Hash) con una clave compartida. La diferencia está en la función hash subyacente, que afecta la longitud de la firma y el margen de seguridad. Para la mayoría de aplicaciones, HS256 proporciona seguridad suficiente. Elige HS384 o HS512 cuando los requisitos de conformidad (p. ej. FIPS-140) exigen un hash más fuerte o cuando tus tokens portan decisiones de autorización de alto valor.

AlgoritmoHashFirmaVelocidadUso típico
HS256SHA-25632 BFastestGeneral purpose, default for most libraries
HS384SHA-38448 BFastHigher security margin, FIPS-140 compliant
HS512SHA-51264 BFastMaximum HMAC security, large payloads

Referencia de afirmaciones JWT estándar

RFC 7519 define siete afirmaciones registradas. Ninguna es obligatoria, pero usarlas correctamente mejora la interoperabilidad y la seguridad. La afirmación exp es especialmente importante — los tokens sin vencimiento son válidos indefinidamente si la clave secreta no se rota.

AfirmaciónNombreDescripciónEjemplo
issIssuerWho issued the token"auth.example.com"
subSubjectWho the token represents"user-123"
audAudienceIntended recipient service"api.example.com"
expExpirationUnix timestamp — token invalid after this time1717203600
nbfNot BeforeUnix timestamp — token invalid before this time1717200000
iatIssued AtUnix timestamp when the token was created1717200000
jtiJWT IDUnique token identifier for revocation tracking"a1b2c3d4"

Codificación JWT en código

Estos ejemplos muestran cómo crear y firmar JWTs mediante programación. Cada fragmento produce un token válido firmado con HS256. Para sistemas en producción, siempre establece la afirmación exp y usa una clave secreta criptográficamente aleatoria de al menos 256 bits.

JavaScript (Web Crypto API)
async function signJWT(payload, secret, alg = 'HS256') {
  const header = { alg, typ: 'JWT' }
  const enc = new TextEncoder()

  // Base64url encode header and payload
  const b64url = (obj) =>
    btoa(JSON.stringify(obj)).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '')

  const h = b64url(header)
  const p = b64url(payload)

  // Sign with HMAC-SHA256
  const key = await crypto.subtle.importKey(
    'raw', enc.encode(secret),
    { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']
  )
  const sig = await crypto.subtle.sign('HMAC', key, enc.encode(`${h}.${p}`))
  const s = btoa(String.fromCharCode(...new Uint8Array(sig)))
    .replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '')

  return `${h}.${p}.${s}`
}

// Usage
const token = await signJWT(
  { sub: 'user-123', name: 'Alice', iat: Math.floor(Date.now() / 1000) },
  'your-256-bit-secret'
)
// → "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOi..."
Python (PyJWT)
import jwt
import time

payload = {
    "sub": "user-123",
    "name": "Alice",
    "iat": int(time.time()),
    "exp": int(time.time()) + 3600,  # expires in 1 hour
}

# Sign with HS256 (default)
token = jwt.encode(payload, "your-256-bit-secret", algorithm="HS256")
# → "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOi..."

# Verify and decode
decoded = jwt.decode(token, "your-256-bit-secret", algorithms=["HS256"])
# → {"sub": "user-123", "name": "Alice", "iat": 1717200000, "exp": 1717203600}
Node.js (jsonwebtoken)
const jwt = require('jsonwebtoken')

const payload = {
  sub: 'user-123',
  name: 'Alice',
  role: 'admin',
}

// Sign — iat is added automatically
const token = jwt.sign(payload, 'your-256-bit-secret', {
  algorithm: 'HS256',
  expiresIn: '1h',    // sets exp claim
  issuer: 'auth.example.com',  // sets iss claim
})

// Verify
const decoded = jwt.verify(token, 'your-256-bit-secret')
// → { sub: 'user-123', name: 'Alice', role: 'admin', iat: ..., exp: ... }
Go (golang-jwt)
package main

import (
    "fmt"
    "time"
    "github.com/golang-jwt/jwt/v5"
)

func main() {
    claims := jwt.MapClaims{
        "sub":  "user-123",
        "name": "Alice",
        "iat":  time.Now().Unix(),
        "exp":  time.Now().Add(time.Hour).Unix(),
    }

    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    signed, _ := token.SignedString([]byte("your-256-bit-secret"))
    fmt.Println(signed)
    // → eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOi...
}

Preguntas frecuentes

¿Cuál es la diferencia entre codificación JWT y decodificación JWT?
La codificación JWT crea un token firmado a partir de un encabezado, carga útil y clave secreta. La decodificación JWT invierte el proceso — lee el encabezado y carga útil codificados en base64url de vuelta a JSON. La decodificación no requiere la clave secreta; la codificación siempre lo hace porque la firma debe calcularse.
¿Cuán larga debe ser mi clave secreta JWT?
Para HS256, usa una clave secreta de al menos 256 bits (32 bytes). Para HS384, usa al menos 384 bits (48 bytes). Para HS512, usa al menos 512 bits (64 bytes). Las claves secretas más cortas son técnicamente aceptadas por la mayoría de bibliotecas pero reducen la seguridad efectiva de la firma HMAC. Genera claves secretas con un generador aleatorio criptográficamente seguro, no una frase elegida por humanos.
¿Es seguro usar esta herramienta con claves secretas reales?
Esta herramienta procesa todo en tu navegador usando la API Web Crypto — no se envían datos a ningún servidor. Dicho esto, evita pegar claves secretas de producción en cualquier herramienta web como práctica de seguridad general. Para la gestión de claves en producción, usa variables de entorno o un gestor de secretos como HashiCorp Vault o AWS Secrets Manager.
¿Debo usar HS256 o RS256 para mi aplicación?
Usa HS256 cuando el mismo servicio crea y verifica tokens — es más rápido y simple. Usa RS256 (asimétrico) cuando servicios de terceros necesitan verificar tus tokens sin la capacidad de crearlos. RS256 es común en proveedores OAuth 2.0, OpenID Connect y arquitecturas SaaS multiinquilino.
¿Por qué mi JWT caduca inmediatamente después de su creación?
La afirmación exp usa marcas de tiempo Unix en segundos, no milisegundos. Si estableces exp a Date.now() (que devuelve milisegundos), el token parecerá caducar miles de años en el futuro — o si accidentalmente usas un valor en milisegundos donde se esperan segundos, las bibliotecas pueden interpretarlo como ya caducado. Siempre usa Math.floor(Date.now() / 1000) en JavaScript o int(time.time()) en Python.
¿Puedo poner datos sensibles en la carga útil JWT?
Puedes, pero no deberías. La carga útil JWT está codificada en base64url, no encriptada — cualquiera con el token puede leer las afirmaciones. No almacenes contraseñas, números de tarjeta de crédito o datos personales en la carga útil. Si debes incluir información sensible, usa JWE (Cifrado de JSON Web) como se define en RFC 7516, que encripta toda la carga útil.
¿Qué sucede si cambio la carga útil después de firmar?
La firma se vuelve inválida. La firma HMAC se calcula sobre los bytes exactos del encabezado y carga útil codificados. Cualquier cambio — incluso agregar un espacio o cambiar un solo carácter — produce una firma completamente diferente. Un verificador implementado correctamente rechazará el token con un error de falta de coincidencia de firma.