Genera tokens, claves de API, secretos y nonces criptograficamente seguros en tu navegador. Elige longitud, juego de caracteres y cantidad.
Tokens aleatorios e impredecibles. Toda la aleatoriedad proviene de crypto.getRandomValues del navegador, la misma fuente que usa para claves TLS. Nada sale de tu dispositivo.
Que hace que un token sea seguro
Aleatorio no es lo mismo que impredecible
La mayoria de lenguajes incluyen dos generadores de numeros aleatorios muy distintos. Math.random(), rand() y similares son generadores pseudoaleatorios rapidos, sembrados con algo barato como el reloj. Sirven para barajar una lista de reproduccion y son desastrosos para un token, porque un atacante que observe unas pocas salidas suele poder recuperar el estado interno y reproducir todos los valores que el generador emitira jamas.
Un generador criptograficamente seguro se construye de forma que ver la salida pasada no diga nada sobre la futura. En el navegador eso es crypto.getRandomValues(), que bebe del pool de entropia del sistema operativo. Esta herramienta lo usa en exclusiva. Si generas tokens en tu propio codigo, los equivalentes son secrets en Python, crypto/rand en Go y java.security.SecureRandom en Java, nunca el modulo random normal ni Math.random().
Evitar el sesgo por modulo
Tener buenos bytes aleatorios es solo la mitad del trabajo. La forma ingenua de elegir un caracter es bytes[i] % alphabet.length, que sesga el resultado en silencio siempre que el tamano del alfabeto no divida 256 de forma exacta. Con un alfabeto de 62 caracteres, los 8 primeros salen algo mas a menudo que el resto: un sesgo pequeno, pero que reduce la entropia real y es del todo evitable.
La solucion es el muestreo por rechazo: descartar cualquier byte que caiga en el bloque final incompleto y volver a sortear. Esta herramienta lo hace, de modo que cada caracter del alfabeto elegido es igual de probable.
Elegir la longitud
La entropia es log2(tamano_alfabeto) * longitud bits. Un alfabeto de 62 caracteres da unos 5,95 bits por caracter, asi que un token de 22 caracteres lleva unos 131 bits, holgadamente fuera del alcance de la fuerza bruta. Para cualquier cosa que proteja acceso real, 128 bits es el minimo habitual; por debajo de unos 64 bits, un atacante decidido con un endpoint rapido pasa a ser una preocupacion genuina.
La eleccion del alfabeto depende sobre todo de por donde viajara el token. Base64url y hexadecimal sobreviven intactos a URLs, nombres de fichero y cabeceras. El alfabeto sin ambiguedades elimina caracteres como 0/O y 1/l/I, y merece la pena para todo lo que una persona vaya a leer en voz alta o reteclear desde una pantalla.
Preguntas frecuentes
¿El token se genera en mi dispositivo?
Sí, íntegramente en tu navegador mediante crypto.getRandomValues(). No se envía nada a ningún servidor ni se registra, así que el valor solo lo conoces tú.
¿Qué longitud debe tener un token?
Para cualquier cosa que proteja un acceso, apunta a 128 bits de entropía como mínimo: 22 caracteres con un alfabeto de 62, o 32 caracteres hexadecimales. Los identificadores sin función de seguridad pueden ser más cortos.
¿Por qué no usar Math.random() para esto?
Es un generador pseudoaleatorio rápido inicializado con algo barato como el reloj. Observar unas pocas salidas puede bastar para recuperar su estado y predecir todos los valores futuros.
¿Para qué sirve la opción sin caracteres ambiguos?
Elimina 0/O y 1/l/I para que el token sobreviva a ser leído en voz alta, escrito a mano o retecleado desde una pantalla sin errores de transcripción.
¿Puedo usarlo para enlaces de restablecimiento de contraseña?
Sí, siempre que guardes solo un hash del token, fijes una caducidad corta y lo invalides tras un único uso. La aleatoriedad es adecuada; el ciclo de vida corresponde a tu aplicación.
¿Podría repetirse el mismo token?
Con 128 bits de entropía una repetición es astronómicamente improbable, pero la herramienta no guarda historial, así que no puede verificar la unicidad entre generaciones por ti.