Cómo generar una clave
- Haz clic en el ajuste que corresponde a lo que estás configurando. 32 bytes está seleccionado al abrir la página.
- Copia el valor de Valores aleatorios. Los ajustes con línea de configuración, como Laravel o Auth.js, la muestran también en Listo para pegar.
- Pulsa Generar nuevos para obtener otra clave, o sube Cantidad para crear varias a la vez, por ejemplo una por entorno.
Los ajustes fijan por ti el número de bytes y el formato. Si cambias cualquiera de los dos campos, la herramienta vuelve a Personalizado y conserva tus valores.
Ajustes y dónde va cada clave
| Ajuste | Qué obtienes | Longitud | Uso típico |
|---|---|---|---|
| 16 / 32 / 64 bytes | bytes aleatorios en Base64 | 24 / 44 / 88 | claves genéricas, salts, secretos |
| APP_KEY de Laravel | base64: + 32 bytes | 51 | APP_KEY en .env |
| Clave AES-128 | 16 bytes, Base64 | 24 | AES-128-GCM o -CBC |
| Clave AES-256 | 32 bytes, Base64 | 44 | AES-256-GCM o -CBC |
| Secreto HMAC | 32 bytes, Base64 | 44 | firmas HMAC-SHA256, webhooks |
| Secreto JWT HS256 | 32 bytes, Base64URL | 43 | JWT_SECRET para tokens HS256 |
| Secreto de Auth.js | 32 bytes, Base64 | 44 | AUTH_SECRET (antes NEXTAUTH_SECRET) |
| SECRET_KEY de Django | 50 caracteres del alfabeto de Django | 50 | SECRET_KEY en settings |
| secret_key_base de Rails | 64 bytes, hex | 128 | secret_key_base |
| Token de API | 32 bytes, Base64URL | 43 | tokens bearer, enlaces de invitación |
| UUID v4 (Base64URL) | un UUID aleatorio en forma corta | 22 | ID compactos; también se muestra el UUID canónico |
El ajuste de nonce CSP sirve para otra cosa y tiene su propia página, el generador de nonce CSP.
Los tamaños vienen de los algoritmos. Las claves AES tienen exactamente 16, 24 o 32 bytes; cualquier otra longitud se rechaza. RFC 7518 exige secretos HS256 de al menos 256 bits, por eso el ajuste JWT usa 32 bytes. Una clave HMAC más corta que la salida del hash debilita HMAC, así que 32 bytes encajan con HMAC-SHA256 y el ajuste de 64 bytes con HMAC-SHA512. El ajuste de Django elige sus 50 caracteres por muestreo de rechazo, de modo que todos los caracteres del alfabeto son igual de probables, igual que hace la propia get_random_secret_key() de Django.
Una clave Base64 es texto; la clave son bytes
El valor que copias es una representación Base64 de bytes aleatorios. El código que lo usa tiene que decodificarlo primero:
import base64, os
key = base64.b64decode(os.environ["AES_KEY"])
assert len(key) == 32
En Node.js lo mismo es Buffer.from(process.env.AES_KEY, "base64"). Si le pasas la cadena de 44 caracteres directamente a una biblioteca AES, o la rechaza (AESGCM key must be 128, 192, or 256 bits en Python, Invalid key length en Node.js) o, en bibliotecas más permisivas, usa bytes equivocados sin avisar. Los frameworks que leen sus propias claves, como Laravel con su prefijo base64:, hacen esta decodificación por ti.
Base64URL y Base64 estándar se decodifican en los mismos bytes, pero los parsers suelen ser estrictos con cuál aceptan. Mantén el formato que generó el ajuste, salvo que sepas que el consumidor acepta el otro.
Claves Fernet y otros formatos
El paquete cryptography de Python espera una clave Fernet de 32 bytes en Base64 URL-safe con relleno, 44 caracteres. Los ajustes JWT y Token de API dan la forma URL-safe sin el =, así que añade uno al final o genérala en Python:
from cryptography.fernet import Fernet
print(Fernet.generate_key().decode())
Para cualquier otro caso, parte del número de bytes: elige Personalizado, introduce los bytes que indica la documentación de tu biblioteca y elige Base64, Base64URL o hex. El generador de Base64 aleatorio explica las longitudes de salida, y HMAC en Base64 o cifrado AES te permiten probar una clave nueva al momento.
Qué hacer con las claves después de generarlas
Una clave generada aquí solo existe en esta pestaña hasta que la copias. A partir de ahí, está tan segura como el sitio donde la pegues. Guarda las claves de producción en el almacén de secretos de tu plataforma o en un gestor de secretos, usa una clave distinta por entorno y no las subas nunca al repositorio; una clave que llegó a un repositorio Git debe considerarse pública y sustituirse. Rotar una clave de cifrado implica volver a cifrar los datos antiguos o conservar la clave anterior para descifrar, así que planifícalo antes de cambiar un APP_KEY en un sistema en producción.
Preguntas frecuentes
¿Cómo genero una clave Base64 de 32 bytes?
El ajuste 32 bytes está seleccionado al abrir la página, así que la clave de la salida ya lo es: 44 caracteres que terminan en =. En una terminal, openssl rand -base64 32 hace lo mismo.
¿Puedo usar la cadena Base64 de 44 caracteres directamente como clave AES-256?
No. AES-256 necesita 32 bytes en bruto, y los 44 caracteres son su texto Base64. Decodifica antes la cadena; si pasas el texto tal cual, falla con un error como “Invalid key length” en Node.js.
¿Cómo genero un APP_KEY de Laravel sin artisan?
Elige el ajuste APP_KEY de Laravel y copia la línea APP_KEY=base64:… en .env. Tiene el mismo formato que escribe php artisan key:generate: el prefijo base64: más 32 bytes aleatorios para el cifrado AES-256-CBC por defecto.
¿Cómo creo aquí una clave Fernet?
No hay un ajuste para Fernet. Elige 32 bytes, pon Formato en Base64URL y añade un = a los 43 caracteres, porque Fernet espera Base64 URL-safe con relleno de 44 caracteres. O ejecuta Fernet.generate_key() en Python.
¿Es seguro generar claves de producción en el navegador?
La clave sale de crypto.getRandomValues, un generador criptográficamente seguro, y la página no puede enviarla a ninguna parte. El riesgo mayor está en lo que pasa después: guarda la clave en un gestor de secretos o en una variable de entorno protegida, nunca en un repositorio.