Subir un archivo
  1. base64hub
  2. Herramientas web y de tokens
  3. Codificador JWT

Codificador y firmador JWT

Edita el encabezado y el payload como JSON, elige un algoritmo y pega un secreto o una clave privada: el token firmado se actualiza mientras escribes. Para RSA, ECDSA y EdDSA la herramienta puede generar un par de claves nuevo con su JWKS.

Gratis sin registro, sin límites Local no se sube nada Claves pares RSA, P-256/384/521 y Ed25519 Actualizado 27 oct 2026
Token

Se procesa en tu navegador. Esta página no puede enviar tus datos a ninguna parte – cómo lo sabemos

Cómo crear un JWT firmado

  1. Elige el Algoritmo. El campo alg de Encabezado (JSON) sigue automáticamente la selección.
  2. Edita Payload (JSON). + iat ahora inserta la hora actual y + exp en 1 h fija la caducidad dentro de una hora; ambos usan segundos, como exige la especificación JWT.
  3. Para HS256, HS384 o HS512, introduce el Secreto y ajusta El secreto es a Texto, Base64 o Hex. Para los demás algoritmos, pega una clave privada o pulsa Generar par de claves.
  4. Copiar token, o pulsa Abrir en el decodificador para comprobarlo: se abre la pestaña Decodificar y verificar con el token y la clave de verificación ya rellenados.

El ejemplo que aparece al cargar es un token HS256 real firmado con el secreto base64hub-demo-secret, así que puedes cambiar un claim y ver cómo cambia la firma con él.

Elegir un algoritmo

AlgoritmoTipo de claveQuién puede verificarFirma en el token
HS256Secreto compartido (HMAC-SHA256)Cualquiera que tenga el mismo secreto43 caracteres
RS256, PS256Clave privada RSA, de 2048 bits o másCualquiera con la clave pública342 caracteres (RSA-2048)
ES256Clave privada EC en P-256Cualquiera con la clave pública86 caracteres
EdDSAClave privada Ed25519Cualquiera con la clave pública86 caracteres

HS256 es la opción más sencilla cuando un solo servicio firma y verifica, como un token de sesión que comprueba el mismo backend. En cuanto otra parte tiene que verificar, compartir con ella un secreto HMAC también le permite emitir tokens, así que pasa a un algoritmo asimétrico y publica solo la clave pública. ES256 y EdDSA dan tokens mucho más cortos que RSA, algo que importa en cookies y cabeceras. PS256 es RSA con el esquema de relleno PSS; elígelo solo si todos los verificadores lo admiten.

none está en la lista para probar parsers. Un token con alg: none tiene la firma vacía y cualquiera puede engañar a un servidor que lo acepte, así que la herramienta avisa de ello.

Claves que acepta y genera este codificador

Para firmar admite una clave PEM PKCS#8 (BEGIN PRIVATE KEY), una RSA PRIVATE KEY PKCS#1, una EC PRIVATE KEY SEC1 o un JWK privado. Para crear claves de prueba con OpenSSL en lugar del generador:

openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out rsa.pem
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out ec.pem
openssl genpkey -algorithm ed25519 -out ed.pem
openssl pkey -in ec.pem -pubout -out ec.pub

Generar par de claves crea en el navegador, con WebCrypto, claves RSA-2048, P-256, P-384, P-521 o Ed25519 según el algoritmo. Obtienes la clave privada en PEM PKCS#8, la clave pública en PEM SPKI y un JWKS cuyo kid es la huella RFC 7638 de la clave. El JWKS es lo que servirías desde un jwks_uri para que lo descarguen los verificadores.

Para HS256, el secreto se usa como bytes. Si tu servidor lee el secreto de una variable de entorno y antes lo decodifica de Base64, pon aquí también El secreto es en Base64, o las firmas no coincidirán. Un valor del preset de secreto JWT del generador de claves Base64 es Base64URL y se decodifica en 32 bytes.

Qué claims poner en el payload

Un access token útil suele llevar iss (quién lo emitió), sub (a quién se refiere), aud (para qué API es), iat y un exp corto. Añade jti si necesitas revocar tokens concretos. Los tiempos son segundos enteros desde 1970; si los generas en JavaScript, usa Math.floor(Date.now() / 1000), porque Date.now() devuelve milisegundos.

El payload se firma, pero nunca se cifra. Cualquiera que vea el token puede decodificarlo con un decodificador JWT, así que deja fuera contraseñas, claves de API y datos personales que no imprimirías en un log.

Firmar un JWT en código

El formato es lo bastante sencillo para construirlo a mano, lo que ayuda al depurar una biblioteca. Esta función de Node.js produce exactamente el mismo token que jwt.encode(payload, secret, algorithm="HS256") de PyJWT para la misma entrada:

const crypto = require("crypto");

const b64url = (obj) => Buffer.from(JSON.stringify(obj)).toString("base64url");

function signHS256(payload, secret) {
  const input = b64url({ alg: "HS256", typ: "JWT" }) + "." + b64url(payload);
  const sig = crypto.createHmac("sha256", secret).update(input).digest("base64url");
  return input + "." + sig;
}

console.log(signHS256({ sub: "user-42", iat: 1767225600, exp: 1767229200 },
                      "replace-me-with-32-random-bytes!"));

Imprime eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyLTQyIiwiaWF0IjoxNzY3MjI1NjAwLCJleHAiOjE3NjcyMjkyMDB9.F3xnXnXW8nUQy-Ay37DF626Lb5lHPKI3IFvqoEf3mTw. Si introduces en esta página el mismo encabezado, payload y secreto, obtienes la misma cadena. La herramienta compacta el JSON antes de firmar, así que la indentación no importa, pero el orden de las claves sí, porque la firma cubre los bytes exactos. En producción, usa una biblioteca mantenida; consulta Base64 en Node.js para la parte de la codificación.

Preguntas frecuentes

¿Qué longitud debe tener un secreto HS256?

Al menos 256 bits, es decir, 32 bytes aleatorios. El RFC 7518 exige una clave al menos tan larga como la salida del hash. Un secreto corto, tipo contraseña, se puede romper por fuerza bruta sin conexión a partir de un solo token, así que genera uno con el generador de claves Base64.

¿Uso HS256 o RS256?

HS256 cuando el mismo servicio emite y verifica los tokens, porque ambos lados comparten un secreto. RS256, ES256 o EdDSA cuando otros tienen que verificar, ya que solo reciben la clave pública y no pueden emitir tokens por su cuenta.

¿Por qué mi clave privada da un error?

Las claves protegidas con contraseña (BEGIN ENCRYPTED PRIVATE KEY) se rechazan. Quita la frase de contraseña con openssl pkey -in key.pem -out plain.pem y pega el resultado. El tipo de clave también debe encajar con el algoritmo: una clave EC no puede firmar RS256.

¿Cómo añado un kid al token?

Después de Generar par de claves, copia el kid de la salida JWKS y añádelo al JSON del encabezado, por ejemplo "kid": "…". Los verificadores lo usan para elegir la clave correcta de su conjunto de claves.