Generador de secreto JWT — HS256/384/512
Genera un secreto JWT fuerte y conforme a la RFC para HS256/384/512 — 100 % en tu navegador, nunca enviado a un servidor. base64url, base64 o hex para .env.
Comandos de CLI equivalentes
¿Qué es un generador de secreto JWT?
Un generador de secreto JWT produce la clave de firma aleatoria que un JSON Web Token firmado con HMAC usa para demostrar que no ha sido manipulado. Cuando firmas un token con HS256, HS384 o HS512, el algoritmo ejecuta HMAC sobre la cabecera y la carga útil del token usando un único secreto compartido; el verificador recalcula el mismo HMAC con el mismo secreto y acepta el token solo si las firmas coinciden. Toda la seguridad de ese esquema descansa en que el secreto sea largo e impredecible — que es exactamente lo que crea esta herramienta: una cadena aleatoria de alta entropía, generada en tu navegador, dimensionada correctamente para el algoritmo que elijas.
Conviene ser preciso sobre lo que esta herramienta hace y no hace. Genera la clave secreta — el valor que pones en tu variable de entorno JWT_SECRET — no un token terminado. Si quieres ensamblar una cabecera y una carga útil y firmarlas en un JWT real, ese es el trabajo del Codificador JWT; para desmontar un token existente y verificar su firma, usa el Decodificador JWT. Piensa en el secreto como la llave y en el codificador como la cerradura que acciona: generas la llave una vez, la guardas a salvo y la reutilizas para firmar y verificar muchos tokens.
¿Cuánto debe medir la clave? La respuesta la fija la especificación, no la preferencia. La RFC 7518 §3.2 — el estándar de los JSON Web Algorithms — exige que una clave HMAC sea al menos tan grande como la salida del hash: "DEBE usarse una clave del mismo tamaño que la salida del hash (por ejemplo, 256 bits para HS256) o mayor". Eso da una tabla limpia que el generador sigue automáticamente:
| Algoritmo | HMAC | Bytes mín. | Bits mín. | caracteres hex | caracteres base64 | caracteres base64url | |-----------|------|-----------|----------|-----------|--------------|-----------------| | HS256 | HMAC-SHA-256 | 32 | 256 | 64 | 44 | 43 | | HS384 | HMAC-SHA-384 | 48 | 384 | 96 | 64 | 64 | | HS512 | HMAC-SHA-512 | 64 | 512 | 128 | 88 | 86 |
Los recuentos de caracteres provienen de las codificaciones RFC 4648 de esas longitudes de bytes: hex duplica el número de bytes; base64 se expande en 4⁄3 con relleno; base64url elimina el relleno, así que una clave de 32 bytes son 43 caracteres base64url en lugar de 44. base64url es la codificación nativa de JWT — alfabeto seguro para URL, sin relleno — por lo que es la salida por defecto aquí; un secreto en base64url puede ir en una cabecera, una URL o un valor de configuración sin escapar.
La aleatoriedad es la parte en la que no puedes transigir. Este generador extrae sus bytes de crypto.getRandomValues, el generador de números pseudoaleatorios criptográficamente seguro del navegador, la misma primitiva que respalda la generación de claves de Web Crypto. Nunca usa Math.random, que es rápido pero predecible y completamente inadecuado para una clave de firma — un RNG predecible significa un secreto adivinable, y un secreto adivinable significa tokens falsificables. Como la verificación HMAC ocurre localmente con el secreto compartido, un atacante que capture un token puede forzar por fuerza bruta una clave débil offline sin límite de tasa; herramientas como hashcat (modo 16500) y jwt_tool existen precisamente para hacer esto. Una clave aleatoria de 32 bytes con entropía plena, en cambio, queda fuera del alcance computacional. La lección es contundente: nunca uses una contraseña, una palabra de diccionario o una cadena escrita a mano como secreto JWT — genera una aleatoria.
Por último, generar la clave del lado del cliente es en sí mismo una propiedad de seguridad. Un secreto de firma nunca debería transmitirse a un tercero, ni siquiera al sitio que te ayuda a crearlo. Cada byte aquí se produce y codifica en tu navegador; nada se sube, registra ni almacena. Cuando estés listo para desplegar la clave, el botón Copiar para .env te entrega una línea JWT_SECRET=…, y si necesitas plegarla en una configuración más amplia el conversor de JSON a .env puede ayudar. Genera, copia, guárdala en un gestor de secretos — y rótala con una cabecera kid y ventanas de validez solapadas cuando llegue el momento.
// The secret you generate here goes straight into your signing code.
// Node.js with jsonwebtoken — the JWT_SECRET env var holds the key.
import jwt from 'jsonwebtoken';
const secret = process.env.JWT_SECRET; // e.g. base64url value from this tool
// Sign a token with HS256 (HMAC-SHA-256).
const token = jwt.sign({ sub: 'user-42', role: 'member' }, secret, {
algorithm: 'HS256',
expiresIn: '15m'
});
// Verify it — pin the algorithm to a whitelist; never trust the token's alg.
const payload = jwt.verify(token, secret, { algorithms: ['HS256'] });
// ---------------------------------------------------------------
// Python with PyJWT — same secret, same algorithm pinning.
// import jwt
// token = jwt.encode({"sub": "user-42"}, key, algorithm="HS256")
// payload = jwt.decode(token, key, algorithms=["HS256"]) # whitelist!
// ---------------------------------------------------------------
// Equivalent-strength CLI generation (32 bytes for HS256):
// openssl rand -base64 32
// node -e "console.log(require('crypto').randomBytes(32).toString('base64url'))"
// python -c "import secrets; print(secrets.token_urlsafe(32))" Características principales
Longitud de clave consciente del algoritmo
Elige HS256, HS384 o HS512 y el generador establece automáticamente el tamaño mínimo de clave de la RFC 7518 §3.2 — 32, 48 o 64 bytes. Puedes pedir una clave más larga, pero nunca puedes aprovisionar por accidente una demasiado corta que viole la especificación o que una biblioteca estricta se niegue a firmar.
Tres formatos de salida seguros para texto
Obtén los mismos bytes aleatorios como base64url (la codificación nativa de JWT, segura para URL y sin relleno — el valor por defecto), base64 estándar o hex, mostrados uno junto a otro. base64url es el valor por defecto más seguro para un JWT_SECRET; cambia de formato cuando un cargador o biblioteca concreta espere otro. La entropía es idéntica en las tres.
Aleatoriedad criptográficamente segura
Cada secreto se extrae de crypto.getRandomValues, el CSPRNG del navegador y la primitiva detrás de la generación de claves de Web Crypto. Nunca Math.random. Eso garantiza una clave con entropía plena sin estructura predecible — la propiedad que pone el secreto fuera del alcance de la fuerza bruta offline.
Copiar para .env en un clic
Copiar para .env envuelve el valor en la asignación convencional JWT_SECRET=…, una línea, sin comillas — lista para pegar en un archivo .env, un secreto de Docker o una variable de CI sin teclear a mano el nombre de la clave. Copiar normal toma el secreto en bruto cuando solo necesitas el valor.
Comandos de CLI equivalentes
Un panel imprime las líneas correspondientes de openssl rand, Node crypto.randomBytes y Python secrets para el algoritmo seleccionado, así que puedes reproducir una clave de fuerza equivalente en un script de aprovisionamiento o un Dockerfile. La mayoría de las herramientas de la competencia lo omiten; aquí viene integrado.
Enmascarado de mostrar / ocultar
El secreto está enmascarado por defecto para que quede fuera de pantalla durante una demo, un tutorial o un uso compartido de pantalla. Revélalo con el icono del ojo solo cuando estés listo para copiar. Las acciones de copiar siempre ponen el secreto real en el portapapeles, esté visible u oculto.
100 % privado, solo en el navegador
El secreto se genera, codifica y muestra enteramente en tu dispositivo. Sin peticiones de red, sin registro, sin almacenamiento — compruébalo en Herramientas de desarrollador → Red. Una clave de firma nunca debería llegar a un tercero, y aquí nunca lo hace, que es toda la razón para generarla del lado del cliente.
Disponible en 15 idiomas
Toda la interfaz — etiquetas, instrucciones y orientación — está localizada en 15 idiomas, así que la herramienta es usable y los consejos de seguridad son claros sin importar dónde trabaje tu equipo.
Ejemplos prácticos
Generar un secreto HS256 en base64url (el valor por defecto)
Algorithm: HS256 · Format: base64url
3sJ9aFq2kP7mWcZ1xL0nVtRbYdGhU8eAoI4QpNlKj0
HS256 firma con HMAC-SHA-256, así que la RFC 7518 §3.2 exige una clave de al menos 32 bytes (256 bits). El generador extrae 32 bytes aleatorios criptográficamente seguros de crypto.getRandomValues y los codifica como base64url — el alfabeto sin relleno y seguro para URL que el propio JWT usa. 32 bytes se convierten en una cadena base64url de 43 caracteres. Pega el valor directamente en JWT_SECRET. Cada clic regenera un secreto nuevo; nada es nunca igual dos veces.
Generar un secreto HS512 (64 bytes / 512 bits)
Algorithm: HS512 · Format: base64url
k2Lp9XqA0mNbVcZ7rT4wYsHfGjUe8RoIdPlNkBvM3xQ1aWtCyZuS6FhEgJ (86 chars)
HS512 usa HMAC-SHA-512, cuya salida de hash es de 64 bytes, así que la RFC 7518 §3.2 obliga a una clave de al menos 64 bytes (512 bits). La herramienta detecta el algoritmo y eleva el número de bytes automáticamente — nunca tienes que recordar el mínimo. 64 bytes aleatorios se codifican en una cadena base64url de 86 caracteres, 88 caracteres en base64 estándar, o 128 caracteres hexadecimales. Elegir aquí un algoritmo más largo es la forma de un solo clic de aprovisionar un secreto de mayor entropía.
Copiar el secreto como una línea .env
Click "Copy for .env"
JWT_SECRET=3sJ9aFq2kP7mWcZ1xL0nVtRbYdGhU8eAoI4QpNlKj0
Copiar para .env envuelve el valor generado en la asignación convencional JWT_SECRET=… para que puedas pegarlo directamente en un archivo .env, un secreto de Docker o una variable de CI sin teclear a mano el nombre de la clave. El valor queda en una sola línea sin comillas alrededor — exactamente lo que esperan los cargadores estilo dotenv. ¿Necesitas la variable incrustada en una configuración más amplia? Combina esto con el conversor de JSON a .env enlazado abajo.
Reproducir el secreto desde una CLI (fuerza equivalente)
Show the CLI command
openssl rand -base64 32
El panel de CLI imprime los comandos de openssl, Node y Python que extraen el mismo número de bytes aleatorios seguros para el algoritmo seleccionado — openssl rand -base64 32 para HS256, …48 para HS384, …64 para HS512. La salida es un secreto de fuerza equivalente, no una cadena idéntica byte a byte: openssl emite base64 estándar con relleno mientras que esta herramienta usa base64url por defecto, así que los alfabetos y los caracteres finales difieren. Usa el que encaje en tu script de aprovisionamiento; la entropía es la misma.
Mostrar y ocultar el secreto
Toggle the eye icon
••••••••••••••••••••••••••••••••••••••••••• ↔ 3sJ9aFq2kP7m…
El secreto está enmascarado por defecto para que no pueda espiarse por encima del hombro ni capturarse en una grabación de pantalla durante una demo o un uso compartido de pantalla. Pulsa el icono del ojo para revelarlo cuando estés listo para copiar, y vuelve a ocultarlo después. Copiar y Copiar para .env funcionan tanto si el valor está visible como enmascarado — el secreto real es siempre lo que llega a tu portapapeles, nunca los puntos.
Cómo usar el generador de secreto JWT
- 1
Elige el algoritmo de firma
Selecciona HS256, HS384 o HS512. El generador aplica al instante la longitud mínima de clave de la RFC 7518 §3.2 para esa variante HMAC — 32, 48 o 64 bytes — así que nunca tienes que consultar el número ni arriesgar una clave demasiado corta.
- 2
Elige el formato de salida
base64url es el valor por defecto — la codificación nativa de JWT, segura para URL y sin relleno. Cambia a base64 estándar si un cargador lo espera, o hex cuando un sistema solo acepta caracteres 0–f. Las tres codifican los mismos bytes aleatorios con idéntica entropía.
- 3
Revela y copia el secreto
El secreto está enmascarado por defecto para mantenerlo fuera de pantalla durante una demo o un uso compartido de pantalla. Pulsa el icono del ojo para revelarlo, luego Copiar para tomar el valor en bruto o Copiar para .env para copiar una línea JWT_SECRET=… lista para un archivo .env o una variable de CI.
- 4
Regenera cuando lo necesites
Pulsa Regenerar para un secreto nuevo e independiente extraído de crypto.getRandomValues. Genera uno por entorno — nunca reutilices la misma clave de firma entre desarrollo, staging y producción.
- 5
Usa el equivalente de CLI o pasa a firmar
El panel de CLI muestra las líneas correspondientes de openssl, Node y Python para aprovisionamiento por script. Con tu secreto en mano, firma un token con el Codificador JWT y confirma la firma con el Decodificador JWT.
Errores comunes con secretos JWT
Usar una contraseña o frase corta como secreto
Una cadena elegida por un humano tiene demasiada poca entropía para una clave de firma y puede recuperarse offline con un ataque de diccionario o de fuerza bruta, tras lo cual cualquier token puede falsificarse. Genera en su lugar un secreto aleatorio con entropía plena.
JWT_SECRET=mySuperSecret123 → low entropy, brute-forceable
JWT_SECRET=3sJ9aFq2kP7mWcZ1xL0nVtRbYdGhU8eAoI4QpNlKj0 → 32 random bytes
Clave más corta de lo que el algoritmo requiere
La RFC 7518 §3.2 obliga a una clave HMAC al menos tan larga como la salida del hash. Una clave de 16 bytes para HS256 está por debajo del suelo de 32 bytes — debilita la firma y algunas bibliotecas la rechazan de plano.
16-byte key with HS256 → below the 32-byte minimum
32-byte key with HS256 → meets RFC 7518 §3.2
Generar la clave con Math.random
Math.random no es criptográficamente seguro — su salida es predecible, así que un secreto construido con él es adivinable y los tokens que firma son falsificables. Una clave de firma debe venir de un CSPRNG como crypto.getRandomValues.
Math.random()-based key → predictable, unsafe
crypto.getRandomValues key → full entropy
Recodificar el secreto antes de firmar
Guarda y alimenta la cadena exacta que produjo la herramienta. Decodificar de base64 a bytes en un servicio pero tratarla como una cadena literal en otro da a ambos lados claves distintas, y cada comprobación de firma falla.
Service A: raw string · Service B: base64-decoded → signatures never match
Both services use the identical stored string → signatures verify
Reutilizar el mismo secreto en todos los entornos
Un único JWT_SECRET compartido por dev, staging y producción significa que una filtración en cualquier parte falsifica tokens en todas, y la rotación se vuelve de todo o nada. Aprovisiona un secreto distinto por entorno.
Same JWT_SECRET in dev, staging, prod → one leak breaks all
A unique secret per environment → blast radius contained
Confiar en el alg del token al verificar
Dejar que el verificador acepte cualquier algoritmo que declare el token habilita las falsificaciones con alg:none y de confusión HS/RS. Pasa una lista blanca explícita de algoritmos por muy fuerte que sea el secreto.
jwt.verify(token, secret) → accepts the token's alg
jwt.verify(token, secret, { algorithms: ['HS256'] }) → pinned Quién usa esta herramienta
- Aprovisionar un JWT_SECRET para un servicio nuevo
- ¿Levantando una API que emite tokens firmados con HMAC? Elige el algoritmo que usa tu biblioteca, copia el secreto como una línea JWT_SECRET=… y ponlo en el entorno del servicio. Genera una clave distinta para desarrollo, staging y producción — nunca compartas un secreto entre entornos.
- Rotar un secreto comprometido o envejecido
- Cuando se sospecha que una clave se ha filtrado o simplemente toca rotarla, genera aquí un secreto nuevo, asígnale un nuevo kid y despliégalo con una ventana de solapamiento para que los tokens activos sigan verificándose hasta que expiren. Ante un compromiso confirmado, rota de inmediato y elimina la clave antigua del conjunto aceptado.
- Reemplazar una clave débil o escrita a mano
- ¿Heredaste un código cuyo JWT_SECRET es una frase corta o un valor de ejemplo copiado? Esa clave es forzable por fuerza bruta offline. Genera un reemplazo de 32 bytes con entropía plena, cámbialo detrás de una ventana de rotación y cierra el agujero de falsificación de tokens antes de que se explote.
- Programar la generación de claves en un pipeline
- ¿Necesitas crear la clave en CI o en un Dockerfile en lugar de a mano? Usa la línea de openssl, Node o Python del panel de CLI para acuñar un secreto de fuerza equivalente dentro de tu script de aprovisionamiento, y usa esta página para entender las longitudes de byte y las codificaciones que produce cada comando.
- Enseñar la firma de JWT de forma segura
- Guía a un equipo por cómo funciona HS256 sin exponer nunca una clave de producción real — genera un secreto desechable en pantalla (enmascarado hasta que lo reveles), firma un token de ejemplo con el Codificador JWT y verifícalo con el Decodificador JWT para que todo el ciclo de firmar y verificar sea visible.
- Comparar los tamaños de clave de HS256, HS384 y HS512
- ¿Decidiendo qué variante HMAC estandarizar? Alterna entre los algoritmos para ver cómo crecen la longitud de clave requerida y la cadena codificada — 43, 64 y 86 caracteres base64url — y elige el equilibrio entre fortaleza y tamaño de token que encaje en tu sistema antes de fijarlo en la configuración.
- Generar claves para desarrollo local
- ¿Necesitas un secreto rápido y válido para poner en marcha un flujo de autenticación local? Genera uno en un clic, cópialo para .env y quedas desbloqueado — con una clave de CSPRNG real en lugar de un marcador de posición que olvidarás reemplazar antes de desplegar.
Cómo funciona el generador
- crypto.getRandomValues (CSPRNG)
- Los secretos se generan rellenando un Uint8Array con crypto.getRandomValues, el generador de números pseudoaleatorios criptográficamente seguro de Web Crypto. Es la misma fuente de entropía que respalda la generación de claves de Web Crypto. Math.random no se usa nunca en ningún sitio — es estadísticamente predecible e inadecuado para cualquier clave criptográfica.
- Dimensionado de clave de la RFC 7518 §3.2
- El número de bytes por algoritmo sigue el requisito de los JSON Web Algorithms de que una clave HMAC sea al menos del tamaño de la salida del hash: 32 bytes para HS256 (SHA-256), 48 para HS384 (SHA-384), 64 para HS512 (SHA-512). Seleccionar el algoritmo fija el mínimo; el generador no emitirá una clave por debajo del suelo de la especificación.
- Codificaciones RFC 4648 (base64url / base64 / hex)
- Los bytes en bruto se codifican con los alfabetos RFC 4648. base64url usa el alfabeto seguro para URL sin relleno (32 bytes → 43 caracteres), base64 estándar usa relleno +, / y = (→ 44 caracteres), y hex escribe dos caracteres por byte (→ 64 caracteres). Cambiar de formato recodifica los mismos bytes — la entropía subyacente no cambia.
- Por qué base64url es el valor por defecto
- Los componentes de JWT están ellos mismos codificados en base64url, y el alfabeto seguro para URL y sin relleno significa que un secreto en base64url nunca necesita escaparse en una cabecera, una URL o un archivo de configuración. El + y la / y el = final de base64 estándar pueden romperse en esos contextos, así que base64url es el valor por defecto conservador para un JWT_SECRET.
- Formato de Copiar-para-.env
- Copiar para .env emite JWT_SECRET=
en una sola línea sin comillas alrededor — la forma que los cargadores estilo dotenv analizan sin modificación. El secreto en bruto nunca incluye caracteres que requerirían comillas en un archivo .env, así que la línea es segura para pegar tal cual. - Comandos de CLI de fuerza equivalente, no idénticos byte a byte
- Los comandos del panel de CLI openssl rand -base64 N, Node randomBytes(N).toString('base64url') y Python secrets.token_urlsafe(N) extraen todos N bytes aleatorios seguros para el algoritmo elegido. Producen claves de fuerza equivalente, no la misma cadena — openssl emite base64 estándar con relleno, así que el alfabeto y los caracteres finales difieren del valor base64url por defecto de esta herramienta.
Buenas prácticas de secretos JWT
- Ajusta la longitud de clave al algoritmo
- Usa al menos 32 bytes para HS256, 48 para HS384 y 64 para HS512, como exige la RFC 7518 §3.2. Este generador lo hace por ti, pero si dimensionas una clave a mano, nunca bajes de la longitud de la salida del hash — una clave HMAC demasiado corta debilita la firma y puede ser rechazada por bibliotecas estrictas.
- Genera siempre con un CSPRNG, nunca con una contraseña
- Un secreto JWT es una credencial de máquina que nadie necesita memorizar, así que gasta toda la entropía: usa una clave aleatoria criptográficamente segura, no una frase de contraseña, una palabra de diccionario o una cadena escrita a mano. Los secretos elegidos por humanos son el objetivo más fácil para los ataques de fuerza bruta offline que las herramientas de cracking de JWT automatizan.
- Usa un secreto único por entorno
- Desarrollo, staging y producción deberían tener cada uno su propio JWT_SECRET. Compartir una clave significa que una filtración en un entorno de bajo riesgo falsifica tokens en todas partes, y hace que la rotación sea de todo o nada. Genera aquí un secreto separado para cada entorno y guarda cada uno en su propio ámbito de gestor de secretos.
- Fija el algoritmo cuando verifiques
- En el lado verificador, pasa siempre una lista blanca explícita de algoritmos — algorithms: ['HS256'] en jsonwebtoken, algorithms=["HS256"] en PyJWT — y nunca confíes en el campo alg dentro del token. Aceptar el algoritmo autodeclarado del token habilita los clásicos ataques de confusión de algoritmo y de falsificación con alg:none, por muy fuerte que sea tu secreto.
- Rota con una cabecera kid y claves solapadas
- Etiqueta los tokens firmados con un identificador de clave (kid) y publica las claves activas a través de un endpoint JWKS para poder rotar sin tiempo de inactividad: firma tokens nuevos con la clave nueva mientras sigues aceptando la antigua hasta que sus tokens expiren. Ante una sospecha de compromiso, sáltate el solapamiento y revoca la clave antigua de inmediato.
Preguntas frecuentes
¿Se envía mi secreto JWT generado a vuestro servidor?
¿Cómo genero un secreto JWT seguro?
¿Cuánto debe medir un secreto JWT HS256?
¿Cuál es la diferencia entre base64url, base64 y hex, y cuál debería elegir?
¿Se puede descifrar un secreto JWT débil?
¿Puedo usar una contraseña como mi secreto JWT?
¿Cómo roto un secreto JWT sin romper los tokens activos?
¿En qué se diferencia una clave HMAC (HS*) de una clave RSA o ECDSA (RS*/ES*)?
Herramientas relacionadas
Ver todas las herramientas →Generador y verificador de hash bcrypt
Herramientas de Seguridad
Genera y verifica hashes bcrypt de contraseñas online — coste ajustable, prefijos $2b$/$2a$/$2y$. 100 % en tu navegador; tu contraseña nunca se sube.
Decodificador JWT
Herramientas de Seguridad
Decodifica tokens JWT online con nuestro decodificador JWT gratis. Inspecciona encabezado, carga útil, firma, expiración y reclamaciones al instante. 100% navegador — tu token nunca sale del dispositivo. Sin registro ni rastreo.
Codificador y Generador JWT
Herramientas de Seguridad
Generador y codificador JWT gratis online. Construye el encabezado y la carga útil, firma con HS256, RS256 o ES256 al instante. 100% en el navegador — tu secreto y tu clave nunca salen de tu dispositivo.
Generador de Hash MD5 Online y Verificador de Checksum
Herramientas de Seguridad
Genera hashes MD5, SHA-256, SHA-1 y SHA-512 gratis — 100% en tu navegador, sin registro. Hashea texto o archivos, verifica checksums y compara hashes con un clic. Tus datos permanecen privados.
Generador de Contraseñas Aleatorias y Seguras
Herramientas de Seguridad
Genera contraseñas seguras al instante — gratis, sin registro, 100% en tu navegador. Personaliza la longitud y los tipos de caracteres, genera hasta 50 contraseñas. Medidor de fortaleza con análisis de entropía.
Generador de Hash SHA-1 (Legado de 160 bits)
Herramientas de Seguridad
Genera hashes SHA-1 en tu navegador — salida hex de 40 caracteres, sin subidas. Herramienta para huellas Git, comprobación de certificados antiguos y auditorías de migración. Datos nunca salen de tu dispositivo.