Longitud y alfabeto: los dos factores que importan
Frente a un ataque de fuerza bruta, la fortaleza de una contraseña depende casi por completo de dos números: cuántos símbolos distintos puede tener cada posición (el tamaño del alfabeto) y cuántas posiciones tiene en total (la longitud). Combinados dan la entropía, medida en bits, que indica cuántas combinaciones posibles hay — cada bit adicional duplica esa cifra.
Ocho caracteres solo en minúsculas usan un alfabeto de 26 símbolos, con una entropía de 8 × log₂(26) ≈ 37.6 bits: unas 200 mil millones de combinaciones, que una GPU actual prueba en horas. La misma longitud combinando minúsculas, mayúsculas, números y símbolos (casi 94 símbolos de alfabeto) sube a 8 × log₂(94) ≈ 52.4 bits, miles de veces más combinaciones posibles. Aun así, alargar la contraseña suele rendir más que ampliar el alfabeto: pasar de 8 a 16 caracteres usando solo minúsculas ya da 16 × log₂(26) ≈ 75.2 bits, más resistente que mezclar los cuatro tipos de carácter en apenas 8 posiciones.
Por qué la aleatoriedad pesa tanto como la longitud
Todos estos cálculos de entropía dan por sentado que cada carácter se eligió de forma verdaderamente aleatoria dentro de todo el alfabeto disponible. Si en cambio hay un patrón detrás — una palabra de diccionario, una fecha, cambiar letras por símbolos parecidos (@ en vez de a) —, el espacio real que un atacante necesita probar se achica muchísimo, sin importar cuántos bits "en teoría" tenga la contraseña. Ese hueco entre entropía teórica y entropía real es exactamente lo que explotan los ataques de diccionario y las listas de contraseñas filtradas. Por eso esta herramienta nunca arma contraseñas combinando palabras o patrones: elige cada carácter de forma independiente y uniforme dentro del alfabeto que se haya seleccionado.
crypto.getRandomValues, no Math.random()
Math.random() está pensado para usos generales — animaciones, muestreos, juegos —, no para criptografía: su algoritmo interno (típicamente un PRNG tipo xorshift) puede reconstruirse a partir de un puñado de valores generados, lo que en teoría permite predecir la salida futura. Generar contraseñas, claves o tokens requiere en cambio un generador criptográficamente seguro, cuya salida sea imposible de distinguir de ruido verdaderamente aleatorio con los recursos de cómputo disponibles.
Para eso existe crypto.getRandomValues, parte de la Web Crypto API presente en todos los navegadores modernos: toma su entropía directamente del generador de números aleatorios del sistema operativo. Esta herramienta usa exclusivamente esa función — nunca Math.random() — para elegir cada carácter de la contraseña.
Caracteres ambiguos
Algunos símbolos se confunden fácilmente según la tipografía: el cero (0) con la letra O mayúscula, o el uno (1) con la ele minúscula (l) y la i mayúscula (I). Cuando la contraseña se va a transcribir a mano — leerla en una pantalla y tipearla en otro dispositivo, por ejemplo — excluir estos caracteres reduce errores de transcripción a cambio de una pérdida mínima de entropía.
Cómo usar esta herramienta
Elige la longitud y qué tipos de carácter incluir (minúsculas, mayúsculas, números, símbolos), con la opción de excluir caracteres ambiguos si hace falta. La contraseña se genera al instante con crypto.getRandomValues, y el medidor de fortaleza muestra la entropía resultante en bits junto con una clasificación (débil, aceptable, fuerte, muy fuerte). Todo el cálculo ocurre en el navegador: a diferencia de otras herramientas de este sitio pensadas para compartir resultados, acá la contraseña generada nunca se envía a un servidor ni queda registrada en la URL.