Seguridad de las contraseñas
Un atacante que intenta entrar en una aplicación protegida con contraseña (un RAR con clave, el correo electrónico…) tiene varias posibilidades de llegar al resultado sin conocer la contraseña. Algunas exigen cierta dosis de inteligencia, ingenio y conocimientos; otras, en cambio, requieren algo de suerte y preparación física. Así que empecemos resumiendo qué posibilidades tiene el atacante.
Cómo descubrir la contraseña de otra persona
- Encontrar a quien conoce la contraseña (por ejemplo, al dueño del correo) y sacársela: engatusarlo, sobornarlo, darle una paliza. Este método no lo describiré más en el artículo :-).
- Intentar sonsacar la contraseña al dueño de forma discreta, por ejemplo con un correo falso; en términos más técnicos se llama phishing (suplantación de identidad). El método consiste en enviar al dueño de la cuenta un correo en el que le pides que te devuelva su nombre de usuario y su contraseña. Depende solo de ti lo creíble que parezca el mensaje: la petición sola probablemente no bastaría y hay que añadirle alguna historia. Es frecuente encontrarse con que «se ha estropeado la base de datos y por eso pedimos a todos los usuarios que introduzcan de nuevo su contraseña y su nombre; si no, les cancelaremos el buzón» y cosas parecidas. Si el mensaje parece realmente serio, el porcentaje de éxito no suele ser pequeño.
- Ataque de diccionario: nos descargamos de internet algunos paquetes con las contraseñas más habituales y las probamos todas. Si tenemos suerte y el dueño usa una contraseña bastante frecuente, la conseguiremos fácilmente. De ahí se deduce la enseñanza fundamental: no uses contraseñas que tengan sentido. Pon, por ejemplo, la contraseña futbol y te garantizo que el primer hacker de pacotilla te la descubrirá en unos segundos. Este es probablemente el método más eficaz: si tienes un diccionario de contraseñas realmente grande, eres capaz de adivinar la contraseña de buena parte de los usuarios sin mucho esfuerzo.
- La fuerza bruta es el método más tosco. Consiste en probar todas las variaciones posibles de contraseñas que existen en el mundo. El programa va componiendo letras según un algoritmo determinado y comprueba si ha acertado con la contraseña buscada. Cuando la encuentra, la guarda y termina. Este método lo analizaremos a continuación.
Fuerza bruta
Un programa que utiliza este método se limita a formar distintas variaciones de palabras y a comprobar si por casualidad ha acertado con la contraseña. Vamos a calcular cuánto tiempo le puede llevar esa comprobación.
Supongamos que tenemos una contraseña de cinco caracteres formada solo por letras minúsculas del alfabeto inglés (sin la ñ ni las vocales con tilde). El alfabeto inglés tiene veintiséis letras. Ahora podemos calcular fácilmente cuántas contraseñas distintas se pueden formar con cinco de esas letras. Usaremos variaciones, porque nos importa el orden (la contraseña morsa no es la misma que samor, aunque estén formadas por las mismas letras) y, además, tenemos que usar variaciones con repetición, porque las letras pueden repetirse en las contraseñas. Y pasamos al cálculo. La fórmula de las variaciones con repetición es VRn,k = nk. En lugar de n ponemos el número de letras entre las que elegimos (el número de letras del alfabeto inglés) y en lugar de k el número de letras de las que consta la contraseña, en nuestro caso cinco. Obtenemos 265, que son aproximadamente doce millones de variaciones distintas. ¿Es mucho o poco?
Depende también de la máquina de que dispongamos. Un trasto antiguo hará pocas comparaciones por segundo y los ordenadores supermodernos hacen diez mil veces más. En estos ejemplos supondré que el ordenador es capaz de hacer diez millones de comparaciones y evaluaciones por segundo. Ya a cualquiera le habrá quedado claro que un ordenador así descubriría una contraseña de cinco caracteres en menos de dos segundos, lo cual no es nada bueno. Pero no nos rindamos.
Reforzamos la contraseña
Una contraseña de cinco caracteres no es segura ni lo más mínimo; algunos sistemas más sensatos ni siquiera permiten elegir una tan corta. Se dice que la contraseña no debería tener menos de ocho caracteres. Calculemos ahora cuántas variaciones existen para una contraseña de ocho caracteres. Igual que en el caso anterior, consideraremos solo las letras minúsculas del alfabeto inglés. Sustituimos en la fórmula y obtenemos 268, que son aproximadamente doscientos mil millones de variaciones. Eso ya es un número más bonito. El ordenador evaluaría todas las variaciones en menos de seis horas. Es mejor que antes, pero veamos cuánto aumentaría la fortaleza de la contraseña si usaras también mayúsculas, cifras y caracteres especiales como guiones bajos, guiones, etc.
Las minúsculas son 26, las mayúsculas también son 26, lo que da en total 52 caracteres. A ello hay que sumar 10 cifras y algunos caracteres especiales. No en todas partes se permiten todos los caracteres especiales, así que, para simplificar, contaré solo con ocho caracteres especiales, para que el número de caracteres se redondee a unos buenos 70. La longitud de la contraseña será de nuevo ocho. Al sustituir obtenemos este número: 708, que, para hacernos una idea mejor, es aproximadamente 5,8 · 1014, en palabras, casi seiscientos billones de variaciones. Eso ya es un número bastante respetable. Nuestro ordenador comprobaría todas las variaciones en ¡dieciséis mil horas! Son casi dos años. El atacante tendría que tener muchísima suerte para descubrir la contraseña en un tiempo razonable. Además, tendría que conocer la longitud de tu contraseña; en caso contrario, tendría que comprobar también las variaciones con menos caracteres.
Algunas personas temen tanto por sus datos que usan contraseñas numéricas. Estas contraseñas resisten muy bien los ataques de diccionario, porque es difícil que en algún diccionario de contraseñas habituales aparezca precisamente 41.274.390.553. Por desgracia, aunque estas contraseñas resisten los ataques de diccionario, resisten peor la fuerza bruta. Las cifras son solo diez, es decir, el número de variaciones es siempre 10k. La fortaleza de la contraseña depende únicamente de su longitud. Nuestra contraseña anterior de ocho caracteres con todos los tipos de caracteres tenía aproximadamente 5,8 · 1014 variaciones. Para alcanzar al menos lo mismo con una contraseña numérica, tendría que tener quince cifras, casi el doble de caracteres. Se ve claramente que es más eficaz elegir una contraseña más corta, pero con más tipos de caracteres.
No subestimes al atacante
El atacante puede ser listo. Después de leer las líneas anteriores has decidido, pongamos, que tu contraseña actual «naranjas» la vas a cambiar al menos por «Naranjas», con lo que el número de variaciones posibles aumenta varias veces, porque el atacante ya tiene que incluir en el algoritmo también las mayúsculas. Pero el atacante puede suponer que la mayúscula estará solo en la primera posición, porque así se recuerda mejor y no es costumbre que haya una mayúscula en medio de la palabra. Así que escribirá un algoritmo que comprueba todas las variaciones de palabras con minúsculas y, en su caso, con una sola mayúscula justo al principio.
Tu contraseña original tenía una complejidad (ahora me refiero a cuántas variaciones podía haber en total si respetáramos la misma forma de la contraseña: ocho letras minúsculas) de 268. Si el atacante no pensara, la nueva contraseña tendría una complejidad de 528, pero si usara el algoritmo descrito arriba, la contraseña tendría una complejidad de 52 · 267. En la primera posición de la contraseña pueden alternarse minúsculas y mayúsculas, que son en total 52, y en las otras siete posiciones solo pueden alternarse minúsculas, lo que ya es una variación con repetición estándar.
Además, el atacante puede saber, por ejemplo, que tu contraseña consta de cuatro letras y cuatro cifras, sin mezclar, siempre las cifras seguidas y las letras seguidas. La complejidad de una contraseña así la calcularíamos de este modo: el primer grupo de cuatro letras tiene en total 264 variaciones y el segundo grupo de cuatro cifras tiene 104 variaciones. Multiplicamos después estos dos resultados: 264 · 104. Si el atacante no supiera si primero van las cifras o las letras, tendríamos que multiplicar además el resultado anterior por dos.
Todavía puedes echar un vistazo a estas tablas, en las que se indican las velocidades de descifrado de contraseñas.