Introducción: Por qué las contraseñas siguen importando
Desde los primeros días de los sistemas informáticos de tiempo compartido en la década de 1960, las contraseñas han sido el principal guardián entre los usuarios y sus datos. Fernando Corbató, el investigador del MIT que fue pionero en el Sistema de Tiempo Compartido Compatible (CTSS), introdujo las contraseñas en 1961, no como una medida de seguridad, sino simplemente para dar a cada usuario un espacio de archivos privado. Más de seis décadas después, las contraseñas siguen siendo el mecanismo de autenticación más extendido en Internet, protegiendo todo, desde cuentas de correo electrónico hasta sistemas bancarios.
Sin embargo, la persona promedio reutiliza contraseñas en docenas de sitios, elige patrones predecibles como Verano2024!, y tiene poca intuición sobre lo que hace que una contraseña sea realmente imposible de adivinar. Este artículo realiza una inmersión técnica profunda en la seguridad de las contraseñas: cómo se calcula la entropía, por qué importa la aleatoriedad, qué dicen las últimas directrices y cómo desarrollar hábitos que realmente lo protejan.
Entendiendo la Entropía: La Matemática de la Imprevisibilidad
La Entropía en la teoría de la información mide la imprevisibilidad. Para las contraseñas, responde a la pregunta: ¿cuántos intentos necesitaría un atacante, en promedio, para descifrar esta contraseña?
La fórmula es:
H = L × log₂(N)
Donde:
- H = entropía en bits
- L = longitud de la contraseña (número de caracteres)
- N = tamaño del conjunto de caracteres (grupo de caracteres posibles)
Tamaños de Conjuntos de Caracteres
| Conjunto de Caracteres | Tamaño (N) | Bits por Carácter |
|---|---|---|
| Solo letras minúsculas | 26 | 4.7 bits |
| Minúsculas + mayúsculas | 52 | 5.7 bits |
| Alfanumérico | 62 | 5.95 bits |
| ASCII imprimible completo | 94 | 6.55 bits |
| ASCII extendido / Unicode | 128+ | 7+ bits |
Ejemplos de Entropía
| Contraseña | L | N | Entropía (H) |
|---|---|---|---|
password |
8 | 26 | 37.6 bits |
P@ssw0rd |
8 | 94 | 52.4 bits |
k9$mQzLw |
8 | 94 | 52.4 bits |
xK#7pL!qR2@v |
12 | 94 | 78.6 bits |
correct horse battery staple |
28 | 26 | 131.9 bits |
Una contraseña con más de 128 bits de entropía se considera computacionalmente inviable de descifrar por fuerza bruta con la tecnología actual. Para ponerlo en contexto, el cifrado AES de 256 bits — considerado inquebrantable — corresponde a un espacio de claves de 2²⁵⁶ combinaciones.
CSPRNG vs Math.random(): Por qué importa la fuente de aleatoriedad
No todos los números aleatorios son iguales. La diferencia entre un generador de contraseñas seguro y uno inseguro a menudo se reduce a la fuente de aleatoriedad.
Math.random() — No es apto para la seguridad
El Math.random() integrado en JavaScript es un Generador de Números Pseudoaleatorios (PRNG). Es rápido y estadísticamente uniforme, pero no es criptográficamente seguro. Su estado interno se puede inferir a partir de su salida, lo que significa que un atacante que observe suficientes valores podría predecir los futuros.
// ❌ Inseguro — NO lo use para generar contraseñas
function contrasenaInsegura(longitud) {
const caracteres = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
return Array.from({ length: longitud }, () => caracteres[Math.floor(Math.random() * caracteres.length)]).join('');
}
crypto.getRandomValues() — La herramienta adecuada
La Web Cryptography API proporciona crypto.getRandomValues(), que extrae entropía del Generador de Números Pseudoaleatorios Criptográficamente Seguro (CSPRNG) del sistema operativo. En Linux esto es /dev/urandom; en Windows es CryptGenRandom. Estas fuentes recopilan entropía de eventos de hardware (pulsaciones de teclas, E/S de disco, temporización de red) y se consideran criptográficamente fuertes.
// ✅ Seguro — usa CSPRNG
function generarContrasena(longitud, conjunto) {
const array = new Uint32Array(longitud);
crypto.getRandomValues(array);
return Array.from(array, (val) => conjunto[val % conjunto.length]).join('');
}
const conjunto =
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+-=[]{}|;:,.<>?';
console.log(generarContrasena(16, conjunto));
// Ejemplo de salida: "aK7!xQz2#Lp9@Wm5"
Nota sobre el sesgo de módulo: El ejemplo anterior tiene un ligero sesgo de módulo cuando
conjunto.lengthno divide exactamente a 2³². Para código de producción, use el muestreo de rechazo para eliminar este sesgo por completo.
Conjuntos de Caracteres y Complejidad
La mayoría de los generadores de contraseñas ofrecen opciones para:
- Letras minúsculas (a–z): 26 caracteres
- Letras mayúsculas (A–Z): 26 caracteres
- Dígitos (0–9): 10 caracteres
- Símbolos (!@#$%^&*…): ~32 caracteres
La combinación de los cuatro da un grupo de 94 caracteres ASCII imprimibles. Cada carácter adicional en su contraseña multiplica el espacio de búsqueda por 94. Una contraseña de 12 caracteres de 94 posibles tiene 94¹² ≈ 4.76 × 10²³ combinaciones, un número astronómico incluso para hardware especializado.
Por qué la longitud supera a la complejidad
Muchos sistemas antiguos requerían "al menos una mayúscula, un dígito, un símbolo", pero permitían contraseñas de 8 caracteres. Una contraseña de 8 caracteres de 94 posibles tiene solo 94⁸ ≈ 6 × 10¹⁵ combinaciones, descifrable con un clúster de GPU moderno en horas. Extender a 16 caracteres de minúsculas puras (26¹⁶ ≈ 4.4 × 10²²) en realidad proporciona más entropía que una contraseña compleja de 8 caracteres.
NIST SP 800-63B: Directrices modernas para contraseñas
La Publicación Especial 800-63B del NIST de los EE. UU. (Directrices de Identidad Digital, 2017, actualizada en 2024) revocó muchas suposiciones ampliamente aceptadas sobre las contraseñas:
Lo que el NIST recomienda ahora
- Longitud mínima de 8 caracteres para contraseñas elegidas por el usuario; 15 caracteres para contraseñas generadas por máquinas.
- Priorizar la longitud sobre la complejidad: las reglas de complejidad obligatorias (mayúsculas + dígitos + símbolos) no aumentan significativamente la seguridad y frustran a los usuarios.
- Verificar las contraseñas contra listas de brechas: rechazar las contraseñas que se encuentran en brechas de datos conocidas (por ejemplo, a través de la API HaveIBeenPwned).
- No realizar rotaciones periódicas forzadas a menos que haya evidencia de compromiso: las rotaciones forzadas conducen a patrones predecibles como
Verano2024→Otoño2024. - Sin reglas de composición: no requerir tipos de caracteres específicos; en su lugar, permitir todos los caracteres imprimibles, incluidos los espacios.
- Limitar la tasa y bloquear los intentos de autenticación para prevenir ataques en línea.
Estas directrices reflejan la realidad de que el comportamiento humano bajo restricciones de complejidad es predecible: las personas añaden ! para cumplir con los requisitos de símbolos, escriben en mayúscula solo la primera letra y usan años que son fáciles de recordar.
Gestores de Contraseñas: La solución práctica
La mayor mejora de seguridad que la mayoría de las personas puede hacer es adoptar un gestor de contraseñas. Un gestor de contraseñas:
- Genera contraseñas fuertes y únicas para cada cuenta.
- Las almacena en una bóveda cifrada (típicamente AES-256).
- Autocompleta credenciales en navegadores y aplicaciones.
- Le alerta sobre contraseñas reutilizadas o filtradas.
Gestores de Contraseñas Populares
| Herramienta | Tipo | Característica Notable |
|---|---|---|
| Bitwarden | Código abierto, nube/auto-hospedado | Nivel gratuito, auditado |
| 1Password | Comercial, nube | Modo de viaje, planes familiares |
| KeePass | Código abierto, local | Completamente fuera de línea, ecosistema de plugins |
| KeePassXC | Código abierto, local | Bifurcación de KeePass multiplataforma |
| Dashlane | Comercial, nube | Monitoreo de la dark web |
La contraseña maestra para su gestor de contraseñas debe ser una frase de contraseña larga y memorable: la única contraseña que usted memoriza.
Frases de Contraseña y el Método Diceware
Para las contraseñas que necesita recordar (como la contraseña maestra de su gestor), las frases de contraseña son muy superiores a las cadenas cortas complejas.
Cómo funciona Diceware
El método Diceware, creado por Arnold Reinhold en 1995, utiliza dados físicos para generar selecciones de palabras verdaderamente aleatorias:
- Obtenga la Lista de Palabras Larga de la EFF (7,776 palabras, indexadas del 11111 al 66666 en base 6).
- Lance 5 dados para obtener un número de 5 dígitos (por ejemplo, 2-4-1-3-6 → 24136).
- Busque la palabra correspondiente (por ejemplo, "clump").
- Repita de 6 a 8 veces para construir una frase de contraseña.
Una frase de contraseña Diceware de 6 palabras extraídas de 7,776 palabras tiene:
H = 6 × log₂(7776) = 6 × 12.93 ≈ 77.6 bits
"correct horse battery staple" (popularizada por el cómic XKCD #936) contiene 4 palabras de un vocabulario común de unas 2,000 palabras, lo que da unos 44 bits de entropía; es ilustrativo pero demasiado corto. Seis o más palabras de la lista completa de Diceware es la recomendación práctica.
Ataques comunes a las contraseñas
Comprender los ataques le ayuda a calibrar las defensas.
Ataques de Diccionario
Los atacantes usan listas de palabras — que van desde millones hasta miles de millones de entradas — combinadas con mutaciones basadas en reglas (poner en mayúsculas las primeras letras, añadir números, sustituir @ por a). Herramientas como Hashcat pueden aplicar miles de reglas de mutación por segundo. Cualquier contraseña derivable de una palabra de diccionario con sustituciones simples es vulnerable.
Ataques de Fuerza Bruta
La fuerza bruta pura prueba cada combinación. Con un equipo de GPU dedicado (8× RTX 4090), las velocidades de descifrado para algoritmos de hash comunes son:
| Algoritmo de Hash | Velocidad (H/s) | Tiempo para descifrar 8 carac. (conjunto de 94) |
|---|---|---|
| MD5 | ~200 GH/s | ~8 horas |
| SHA-1 | ~70 GH/s | ~24 horas |
| bcrypt (coste 10) | ~184 kH/s | ~1,100 años |
| Argon2id | ~1 kH/s | ~200,000 años |
Esta tabla ilustra por qué el hashing de contraseñas adecuado en el lado del servidor importa enormemente, pero también por qué una contraseña aleatoria de 16 caracteres resiste incluso el hashing MD5.
Tablas Arcoíris (Rainbow Tables)
Tablas de hash a contraseña precalculadas que intercambian almacenamiento por velocidad. Derrotadas por completo por el salado (salting): añadir un valor aleatorio único a cada contraseña antes de aplicar el hash. Los algoritmos modernos como bcrypt y Argon2 incluyen el salado por diseño.
Relleno de Credenciales (Credential Stuffing)
Usar pares de usuario/contraseña filtrados de una brecha para atacar otros servicios. La defensa es usar contraseñas únicas por sitio, que es donde brillan los gestores de contraseñas.
Por qué la generación de contraseñas en el navegador es más segura
Nuestra herramienta genera contraseñas completamente en su navegador usando JavaScript. Ningún dato sale de su dispositivo. He aquí por qué eso importa:
- Sin transmisión al servidor: la contraseña nunca toca un paquete de red.
- Sin registros en el servidor: no hay nada que citar judicialmente, filtrar o vulnerar.
- Sin dependencias de terceros al momento de la generación: sin llamadas a API, sin scripts externos durante la generación.
- Reproducible: usted puede inspeccionar el código fuente para verificar la lógica.
Compare esto con los generadores del lado del servidor: incluso con HTTPS, la contraseña generada existe en la memoria del servidor, podría aparecer en los registros de acceso y depende totalmente de la confiabilidad del operador.
La API web relevante es sencilla:
// El CSPRNG del navegador — disponible en todos los navegadores modernos
const buffer = new Uint8Array(32);
self.crypto.getRandomValues(buffer);
// El buffer ahora contiene 32 bytes criptográficamente aleatorios
Almacenamiento de Contraseñas: bcrypt, scrypt y Argon2
Cuando los servicios almacenan contraseñas, nunca deben almacenar texto plano o formas cifradas reversibles. El enfoque correcto es una función de hashing de contraseñas (PHF), una función lenta y unidireccional diseñada específicamente para este propósito.
bcrypt
Diseñado en 1999 por Niels Provos y David Mazières, bcrypt incorpora un factor de coste que puede aumentarse a medida que el hardware se vuelve más rápido. Un coste de 12 significa 2¹² = 4,096 iteraciones de la configuración de clave Blowfish. Es el estándar hoy en día y cuenta con un amplio soporte.
scrypt
Diseñado por Colin Percival en 2009. Es "memory-hard", lo que requiere grandes cantidades de RAM además de tiempo de CPU, lo que hace que los ataques con GPU/ASIC sean costosos. Parámetros: N (coste de CPU/memoria), r (tamaño de bloque), p (paralelización).
Argon2
Ganador de la Password Hashing Competition (PHC) en 2015. Tres variantes:
- Argon2d: resistente a GPU, vulnerable a ataques de canal lateral.
- Argon2i: resistente a canales laterales, menos resistente a GPU.
- Argon2id: híbrido, el recomendado por defecto.
Argon2id con m=65536 (64 MB de memoria), t=3 (3 iteraciones), p=4 (4 hilos) es el estándar de oro actual para nuevas aplicaciones.
Autenticación de Dos Factores: El complemento esencial
Incluso una contraseña perfecta puede ser robada mediante phishing, keyloggers o brechas de datos. La autenticación de dos factores (2FA) garantiza que una contraseña robada por sí sola no sea suficiente.
Métodos de 2FA (Del más débil al más fuerte)
| Método | Mecanismo | Resistencia a Ataques |
|---|---|---|
| SMS OTP | Código enviado por texto | Vulnerable a phishing y SIM-swapping |
| TOTP (Google Authenticator) | Código de 6 dígitos basado en tiempo | Vulnerable a phishing en tiempo real |
| Notificación push | Aprobar/denegar en el teléfono | Vulnerable a phishing (fatiga de MFA) |
| Llave de hardware (FIDO2/WebAuthn) | YubiKey, Passkey | Resistente al phishing |
| Passkeys (Llaves de acceso) | Llave criptográfica vinculada al dispositivo | La más fuerte; reemplaza contraseñas |
Las llaves de hardware FIDO2/WebAuthn y las passkeys son resistentes al phishing por diseño porque el desafío-respuesta criptográfico está vinculado al dominio exacto. Un sitio falso no puede reutilizar la credencial.
Resumen de Mejores Prácticas
- Use un gestor de contraseñas: genere y almacene contraseñas únicas para cada cuenta.
- Mínimo 16 caracteres para cuentas sensibles; 12 mínimo en cualquier otro lugar.
- Habilite 2FA, preferiblemente FIDO2/WebAuthn o TOTP; evite el SMS si es posible.
- Nunca reutilice contraseñas: una brecha en un sitio no debería comprometer a otros.
- Verifique HaveIBeenPwned: compruebe que sus correos y contraseñas no hayan aparecido en brechas conocidas.
- Use una frase de contraseña para su contraseña maestra: 6+ palabras Diceware, memorable, extremadamente fuerte.
- Desconfíe del "teatro de la complejidad":
P@ssw0rd123es mucho más débil quexK8mLq2vZnRj. - Priorice la longitud: 20 letras minúsculas aleatorias (94 bits) superan a 12 caracteres complejos (78 bits).
- Actualice las contraseñas vulneradas de inmediato: rote solo cuando haya compromiso, no en horarios arbitrarios.
- Use herramientas de verificación de brechas: servicios como Firefox Monitor o 1Password Watchtower supervisan sus cuentas continuamente.
Preguntas Frecuentes
P: ¿Qué tan larga debe ser mi contraseña? Para la mayoría de las cuentas, 16 caracteres aleatorios de un conjunto completo de 94 caracteres proporcionan unos 105 bits de entropía, lo cual es más que suficiente. Para cuentas de alto valor (bancos, correo, gestor de contraseñas), use 20+ caracteres o una frase de contraseña de 6 palabras.
P: ¿Es seguro usar un generador de contraseñas en línea? Solo si toda la generación ocurre en el lado del cliente (en su navegador) sin comunicación con el servidor. Nuestra herramienta cumple con este requisito. Verifíquelo comprobando la pestaña de red del navegador: no deberían dispararse solicitudes al generar una contraseña.
P: ¿Debo incluir símbolos? Los símbolos aumentan la entropía por carácter (6.55 bits frente a 5.17 bits para solo minúsculas), así que sí, si el sitio lo permite. Sin embargo, algunos sitios restringen ciertos símbolos. Una contraseña más larga sin símbolos puede igualar la entropía de una más corta con símbolos.
P: ¿Pueden las computadoras cuánticas descifrar mi contraseña? El algoritmo de Grover otorga a las computadoras cuánticas una aceleración cuadrática para los ataques de fuerza bruta, reduciendo efectivamente a la mitad los bits de seguridad. Una clave de 256 bits se vuelve segura como una de 128 bits. Para las contraseñas, esto significa que se necesitarían contraseñas de 256 bits de entropía para la resistencia cuántica a largo plazo, lo cual se logra con una contraseña de 40 caracteres de entre 94 posibles (262 bits). Para la mayoría de las amenazas actuales, 128 bits de entropía (20 caracteres aleatorios) es más que suficiente.
P: ¿Qué hay de malo con las contraseñas memorables como AmoLaPizza2024?
Son vulnerables a ataques de diccionario. El motor de reglas de Hashcat genera trivialmente millones de variaciones de frases comunes con leetspeak, mayúsculas y números añadidos. Incluso las contraseñas aparentemente personales siguen patrones que los atacantes modelan estadísticamente.
Q: ¿Cómo genera aleatoriedad esta herramienta?
Usamos crypto.getRandomValues(), la Web Cryptography API respaldada por el CSPRNG de su sistema operativo. Esta es la misma fuente de aleatoriedad utilizada por TLS/SSL, la generación de claves SSH y otras operaciones criptográficas en su navegador.