Que Hace Fuerte a una Contraseña
Una contraseña fuerte generada por maquina tiene dos propiedades: alta entropía (impredecibilidad) y sin patrones (sin palabras de diccionario, recorridos de teclado, sustituciones).
La entropía se mide en bits. Cada bit duplica el número de contraseñas posibles que un atacante debe probar. Una contraseña elegida uniformemente al azar de un conjunto de N caracteres posibles tiene log2(N) bits de entropía por carácter.
| Conjunto de caracteres | Caracteres disponibles | Entropía por carácter |
|---|---|---|
| Solo minusculas | 26 | 4,7 bits |
| Minusculas + digitos | 36 | 5,2 bits |
| Mayusculas + minusculas + digitos | 62 | 5,9 bits |
| ASCII imprimible completo | 95 | 6,6 bits |
Una contraseña de 20 caracteres del conjunto ASCII imprimible completo tiene aproximadamente 130 bits de entropía. Una contraseña de 20 caracteres limitada a solo minusculas tiene 94 bits. El conjunto de caracteres importa, pero la longitud importa aún más: agregar un carácter del conjunto de 95 caracteres agrega 6,6 bits de entropía. Duplicar el conjunto de caracteres de 26 a 95 solo agrega aproximadamente 1,9 bits por carácter.
NIST SP 800-63B Sobre Contraseñas
Las directrices NIST (actualizadas en 2024) merecen conocerse porque contradicen la sabiduria convencional heredada sobre politicas de contraseñas:
- La longitud es el factor más importante. NIST recomienda soportar contraseñas de al menos 64 caracteres.
- Las reglas de complejidad (exigir mayusculas, símbolos, digitos) son contraproducentes cuando son obligatorias porque producen patrones predecibles (Password1! es el ejemplo canonico de una contraseña “compleja” pero debil).
- La rotación forzada periodica debilita la seguridad al entrenar a los usuarios para hacer cambios pequenos y predecibles (Password1! se convierte en Password2!).
- Las listas negras de contraseñas (bloquear contraseñas conocidas como comprometidas) son más efectivas que las reglas de complejidad.
Para contraseñas generadas por maquina almacenadas en un gestor, ninguna de estas restricciones de politica importa. Usa entropía completa y máxima longitud.
Entropía de Contraseñas vs Passphrases
Una contraseña aleatoria de 20 caracteres y una passphrase son herramientas diferentes para situaciones diferentes.
Una passphrase Diceware de 4 palabras (elegidas al azar de 7776 palabras):
correct horse battery staple
Entropía: log2(7776^4) ~ 51,7 bits/palabra x 4 = aproximadamente 207 bits. Mas entropía que una contraseña aleatoria de 20 caracteres.
Una passphrase Diceware de 6 palabras tiene aproximadamente 310 bits. Es irrompible. Y se puede escribir y memorizar, lo que la convierte en la elección correcta para:
- Contraseñas maestras del gestor de contraseñas
- Passphrases de cifrado de disco completo
- Passphrases de claves SSH
- Cualquier cosa que necesites memorizar o escribir sin autocompletado
Usa contraseñas de caracteres aleatorios para todo lo almacenado en tu gestor. Usa passphrases para el punado de credenciales que necesitas recordar o escribir regularmente.
Web Crypto API vs Math.random()
La diferencia de implementación no es sutil:
// INCORRECTO: Math.random() no es criptograficamente seguro
function insecurePassword(length) {
const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
return Array.from({ length }, () => chars[Math.floor(Math.random() * chars.length)]).join("");
}
// CORRECTO: crypto.getRandomValues() es un CSPRNG
function securePassword(length) {
const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*";
const array = new Uint32Array(length);
crypto.getRandomValues(array);
return Array.from(array, (n) => chars[n % chars.length]).join("");
}
La operación % chars.length agrega un pequeno sesgo de modulo cuando el tamaño del conjunto de caracteres no divide uniformemente 2^32. Para un conjunto de 95 caracteres y un valor aleatorio de 32 bits, el sesgo es insignificante en la práctica (los caracteres más comunes aparecen aproximadamente un 0,002% más frecuentemente que los menos comunes). Para una aplicación critica de seguridad, usa muestreo por rechazo para eliminar incluso este pequeno sesgo.
Como Genera Contraseñas Esta Herramienta
El generador funciona completamente en tu navegador. Ninguna contraseña se envía a ningun servidor. La fuente de aleatoriedad es el método crypto.getRandomValues() de Web Crypto API, que todos los navegadores modernos exponen y que obtiene valores del CSPRNG del sistema operativo.
Despues de generar, copia la contraseña directamente a tu gestor de contraseñas. Evita pegarla en ubicaciones intermedias donde el valor podría guardarse o sincronizarse (borradores de correo electronico, aplicaciones de notas, ventanas de chat).