La potencia de cálculo de las computadoras no cesa de aumentar, lo que permite a los usuarios resolver tareas cada vez más complejas con mayor rapidez. Esto lleva, entre otras cosas, a que contraseñas que hace unos años eran imposibles de descifrar, hoy en 2024, los atacantes logren descifrarlas en cuestión de segundos. Por ejemplo, la GPU RTX 4090 es capaz de descifrar una contraseña de ocho dígitos formada por letras latinas, sólo minúsculas o sólo mayúsculas, y números (es decir, 36 caracteres diferentes disponibles para combinar) en sólo 17 segundos.
Realizamos un estudio sobre la resistencia a la fuerza bruta de las contraseñas y descubrimos que una gran parte (el 59%) puede descifrarse en menos de una hora.
Cómo se suelen almacenar las contraseñas
Para autenticar a los usuarios, los servicios necesitan almacenar de alguna forma pares de nombre de usuario y contraseña, con los que cotejarán los datos introducidos por el usuario. En la mayoría de los casos, las contraseñas no se almacenan en texto plano, sino como hashes para que los atacantes no puedan utilizarlas si llegaran a filtrarse. Para excluir el descifrado de contraseñas a partir de las tablas rainbow existentes, se añade sal a la contraseña antes del calcular el hash.
Aunque los hashes son intrínsecamente irreversibles, teniendo acceso a una base de datos filtrada, un atacante puede intentar descifrar las contraseñas. En este caso, tendrá un número ilimitado de intentos, porque la propia base de datos no está protegida contra la fuerza bruta. También existen herramientas de descifrado de contraseñas disponibles en Internet, como hashcat.
Metodología de la investigación
Nuestra investigación se basó en 193 millones de contraseñas encontradas en publicaciones en diversos recursos de la darknet. Excención de responsabilidad: Kaspersky no recopila ni almacena las contraseñas de los usuarios (puede obtener más información al respecto aquí y aquí).
Hemos evaluado el tiempo necesario para hacer coincidir una contraseña con su hash utilizando tanto la fuerza bruta (brute force) exhaustiva, como varios algoritmos avanzados (fuerza bruta basada en diccionarios y/o combinaciones de caracteres comunes). En este caso, por diccionario entendemos una lista de combinaciones de caracteres utilizadas con frecuencia en las contraseñas. Incluye, entre otras cosas, palabras reales de la lengua inglesa.
Fuerza bruta
El método de fuerza bruta sigue siendo uno de los más sencillos y fáciles de entender: la máquina prueba todas las variantes posibles de la contraseña hasta dar con la correcta. Este método no es universal: no tiene en cuenta las contraseñas de diccionario y descifra mucho peor las contraseñas largas que las cortas.
Analizamos la velocidad con que los ataques de fuerza bruta descifran las contraseñas en la base de datos investigada. Para mayor claridad, dividimos las contraseñas de la muestra en esquemas según los tipos de caracteres utilizados en ellas:
- a – la contraseña tiene letras minúsculas o mayúsculas;
- aA – la contraseña tiene tanto minúsculas como mayúsculas;
- 0 – hay números en la contraseña;
- ! – hay caracteres especiales en la contraseña.
El tiempo necesario para encontrar una contraseña por fuerza bruta depende de su longitud y del número de tipos de caracteres que contenga. Los resultados de la tabla se han calculado para la tarjeta gráfica RTX 4090 y el algoritmo hash MD5 con sal. La velocidad de descifrado con esta configuración es de 164 000 millones de hashes por segundo. Los datos del cuadro están redondeados.
Esquema de la contraseña | Porcentaje de contraseñas de este tipo en la muestra, % |
Porcentaje de contraseñas que pueden ser descifradas por fuerza bruta (por esquema, %) |
Longitud mínima de la contraseña en caracteres por tiempo de descifrado |
|||||||
Menos de un minuto | De un minuto a una hora | De una hora a un día | De un día a un mes | De un mes a un año | Más de un año | De un día a un mes | De un mes a un año | Más de un año | ||
aA0! | 28 | 0,2 | 0,4 | 5 | 0 | 9 | 85 | — | 9 | 10 |
a0 | 26 | 28 | 13 | 15 | 11 | 10 | 24 | 11 | 12 | 13 |
aA0 | 24 | 3 | 16 | 11 | 0 | 15 | 55 | — | 10 | 11 |
a0! | 7 | 2 | 9 | 0 | 14 | 15 | 59 | 9 | 10 | 11 |
0 | 6 | 94 | 4 | 2 | 0 | 0 | 0 | — | — | — |
a | 6 | 45 | 13 | 10 | 9 | 6 | 17 | 12 | 13 | 14 |
aA | 2 | 15 | 22 | 11 | 14 | 0 | 38 | 10 | — | 11 |
a! | 1 | 6 | 9 | 11 | 0 | 11 | 62 | — | 10 | 11 |
aA! | 0,7 | 3 | 2 | 12 | 10 | 0 | 73 | 9 | — | 10 |
0! | 0,5 | 10 | 27 | 0 | 18 | 13 | 32 | 10 | 11 | 12 |
! | 0,006 | 50 | 9 | 10 | 5 | 6 | 19 | 11 | 12 | 13 |
El tipo de contraseña más popular (28%) incluye letras minúsculas y mayúsculas, caracteres especiales y números. La mayoría de estas contraseñas en la muestra investigada son difíciles de forzar. Alrededor del 5% se pueden descifrar en un día, mientras que el 85% de las contraseñas de este tipo tardarán más de un año en recuperarse. El tiempo de descifrado depende de la longitud: una contraseña de nueve caracteres puede descifrarse en un año; una de diez, en más de un año.
Las contraseñas menos resistentes a la fuerza bruta constan sólo de letras, sólo de números o sólo de caracteres especiales. El porcentaje total de este tipo de contraseñas en nuestra muestra fue del 14%. La mayoría se descifran en menos de un día. La longitud de una contraseña segura formada sólo por letras empieza en 11 caracteres. En la muestra no había contraseñas seguras formadas por números.
Fuerza bruta inteligente
Como ya hemos mencionado, la fuerza bruta no es un buen algoritmo para descifrar contraseñas. A menudo, los usuarios utilizan determinadas combinaciones de caracteres como contraseñas: palabras, nombres, fechas, secuencias (12345 o qwerty). Si se tiene esto en cuenta a la hora de tratar de descifrarlas, se puede acelerar el proceso:
- bruteforce_corr es una versión optimizada de la fuerza bruta. Se puede utilizar una muestra amplia para estimar la frecuencia con la que se utiliza un determinado esquema de contraseñas. A continuación, se asigna a cada variante una fracción de tiempo de uso de potencia computacional, que corresponde a la frecuencia de aparición de este esquema entre los usuarios. Así, si tenemos tres esquemas, de los cuales el primero se utiliza el 50% del tiempo, y el segundo y el tercero el 25%, entonces para un minuto condicional de búsqueda emplearemos 30 segundos en el esquema 1, y 15 segundos cada uno en los esquemas 2 y 3.
- zxcvbn es un algoritmo avanzado para evaluar la seguridad de las contraseñas. Para una contraseña concreta, el algoritmo determina su esquema (por ejemplo, “palabra, 3 números” o “carácter especial, palabra del diccionario, secuencia de dígitos”). A continuación, cuenta el número de iteraciones necesarias para cada elemento del circuito. Por ejemplo, si una contraseña contiene una palabra del diccionario, se necesitará un número de iteraciones igual a la longitud del diccionario. Si parte del patrón es aleatorio, tendrá que ser descifrado por fuerza bruta. Conociendo los tiempos estimados para emparejar todas las partes del esquema, podemos calcular la complejidad total del emparejamiento de contraseñas. Este método tiene una limitación: es necesario especificar una contraseña concreta o adivinar su esquema para encontrarla. Sin embargo, la popularidad de los sistemas puede calcularse a partir de muestras ya robadas. Entonces, como en la variante de fuerza bruta, se le debe dar al esquema un tiempo computacional proporcional a la frecuencia con que ocurre. Denominaremos a este algoritmo
- unogram es el algoritmo lingüístico más sencillo. No requiere un esquema de contraseñas, sino que se basa en la frecuencia de uso de cada carácter, que podemos calcular a partir de una muestra de contraseñas. El algoritmo favorece a los caracteres más populares en el descifrado. Por consiguiente, para estimar el tiempo de coincidencia, basta con calcular la probabilidad de aparición de los caracteres disponibles en la contraseña.
- 3gram_seq, ngram_seq: estos algoritmos calculan la probabilidad del siguiente carácter en función de n-1 caracteres anteriores. El algoritmo propuesto comienza con un símbolo y añade sucesivamente el siguiente, empezando por los n-gramas más largos y frecuentes. En la investigación, utilizamos n-gramas que aparecían más de 50 veces en la base de datos de contraseñas, con una longitud de 1 a 10 caracteres. El algoritmo 3gram_seq se limita a n-gramas de hasta 3 caracteres de longitud.
- 3gram_opt_corr, ngram_opt_corr es una versión optimizada de n-gram. El algoritmo anterior generaba la contraseña desde el principio, añadiendo un carácter cada vez. Sin embargo, en algunos casos, el descifrado es más rápida si se empieza por el final, por el medio, o por varios sitios a la vez. Los algoritmos *_opt_* comprueban las variantes descritas para una contraseña concreta y seleccionan la mejor. Sin embargo, en este caso necesitamos un esquema de contraseñas con una indicación de dónde empezar a generarlas. Como necesitan ajustes para diferentes esquemas, estos algoritmos son más lentos por término medio. Sin embargo, para contraseñas específicas, pueden suponer una ventaja significativa.
Además, para cada contraseña calculamos el valor best: el mejor tiempo de descifrado entre todos los algoritmos utilizados. Se trata de un caso hipotético ideal. Para ponerlo en práctica, hay que “adivinar” un algoritmo adecuado o ejecutar simultáneamente cada uno de los algoritmos descritos en una tarjeta de video distinta.
A continuación se muestran los resultados de la evaluación de la seguridad de las contraseñas mediante los algoritmos descritos en la tarjeta de video RTX 4090 para MD5 con sal.
Tiempo de descifrado | Porcentaje de contraseñas que se pueden descifrar con el método especificado | |||||||
ngram_seq | 3gram_seq | unogram | ngram_opt _corr |
3gram_opt _corr |
zxcvbn _corr |
bruteforce _corr |
Best | |
Menos de un minuto | 41% | 29% | 12% | 23% | 10% | 27% | 10% | 45% |
De un minuto a una hora | 14% | 16% | 12% | 15% | 12% | 15% | 10% | 14% |
De una hora a un día | 9% | 11% | 12% | 11% | 12% | 9% | 6% | 8% |
De un día a un mes | 7% | 9% | 11% | 10% | 11% | 9% | 9% | 6% |
De un mes a un año | 4% | 5% | 7% | 6% | 8% | 6% | 10% | 4% |
Más de un año | 25% | 30% | 47% | 35% | 47% | 35% | 54% | 23% |
Conclusión: utilizando el algoritmo más eficaz, el 45% de las contraseñas de la muestra del estudio pueden descifrarse en un minuto, el 59% en una hora y el 73% en menos de un mes. Se tardará más de un año en descifrar solo el 23% de las contraseñas.
Es importante tener en cuenta que descifrar todas las contraseñas de la base de datos llevará casi tanto tiempo como descifrar una sola contraseña. Durante el descifrado por fuerza bruta, el atacante comprueba si el hash obtenido en la iteración actual está disponible en la base de datos. Si lo está, la contraseña concreta se marca como comprometida y el algoritmo continúa recogiendo otras contraseñas.
Las palabras presentes en el diccionario reducen la seguridad de las contraseñas
Para analizar qué esquemas de contraseñas son más resistentes a el descifrado, calculamos el mejor valor para un conjunto ampliado de criterios. Para ello, recopilamos un diccionario de combinaciones de cuatro o más caracteres que aparecen con frecuencia y las añadimos a los esquemas de contraseñas anteriores:
- dict: la contraseña contiene una o más palabras del diccionario.
- dict_only: la contraseña sólo contiene palabras del diccionario.
Esquema de la contraseña | Porcentaje de contraseñas, % | Porcentaje de contraseñas que pueden descifrarse mediante el método del diccionario (por esquema, %) | Longitud mínima de la contraseña en caracteres por tiempo de descifrado | |||||||
Menos de un minuto | De un minuto a una hora | De una hora a un día | De un día a un mes | De un mes a un año | Más de un año | De un día a un mes | De un mes a un año | Más de un año | ||
dict_a0 | 17 | 63 | 15 | 8 | 5 | 3 | 7 | 10 | 11 | 12 |
aA0! | 14 | 5 | 6 | 5 | 5 | 3 | 76 | 6 | 7 | 8 |
dict_aA0 | 14 | 51 | 17 | 10 | 7 | 4 | 11 | 9 | 10 | 11 |
dict_aA0! | 14 | 34 | 18 | 12 | 10 | 6 | 20 | 7 | 8 | 8 |
a0 | 10 | 59 | 22 | 6 | 6 | 1.8 | 6 | 10 | 11 | 12 |
aA0 | 10 | 19 | 13 | 13 | 6 | 7 | 42 | 9 | 10 | 11 |
0 | 6 | 92 | 5 | 1.5 | 1.3 | 0 | 0 | 15 | — | — |
dict_a0! | 5 | 44 | 16 | 10 | 8 | 5 | 17 | 9 | 9 | 10 |
dict_a | 4 | 69 | 12 | 6 | 4 | 2 | 6 | 11 | 12 | 13 |
a0! | 2 | 31 | 19 | 13 | 9 | 5 | 23 | 9 | 9 | 10 |
a | 1.2 | 76 | 7 | 6 | 3 | 3 | 6 | 11 | 12 | 13 |
dict_aA | 1.2 | 56 | 15 | 8 | 6 | 3 | 11 | 9 | 10 | 10 |
dict_a! | 0.8 | 38 | 16 | 10 | 8 | 5 | 23 | 8 | 9 | 10 |
aA | 0.7 | 26 | 10 | 28 | 7 | 2 | 27 | 9 | 10 | 10 |
dict_aA! | 0.5 | 31 | 17 | 11 | 10 | 6 | 26 | 8 | 9 | 9 |
0! | 0.4 | 53 | 15 | 8 | 7 | 5 | 13 | 9 | 10 | 11 |
dict_only | 0.2 | 99.99 | 0.01 | 0.0002 | 0.0002 | 0 | 0 | 18 | — | — |
dict_0 | 0.2 | 89 | 6 | 2 | 2 | 0 | 0 | 15 | — | — |
aA! | 0.2 | 11 | 8 | 10 | 16 | 3 | 52 | 8 | 9 | 9 |
a! | 0.1 | 35 | 16 | 10 | 9 | 5 | 25 | 8 | 9 | 10 |
dict_0! | 0.06 | 52 | 13 | 7 | 6 | 4 | 17 | 9 | 10 | 11 |
! | 0.006 | 50 | 10 | 6 | 8 | 4 | 20 | 8 | 9 | 10 |
La mayoría de las contraseñas examinadas (57%) contienen una palabra del diccionario, lo que reduce significativamente su resistencia a el descifrado. La mitad de ellas tardarán menos de un minuto en descifrarse, el 67% pueden descifrarse en menos de una hora y sólo el 12% son resistentes, es decir, se tarda más de un año en descifrarlas. Aunque una contraseña de este tipo utilice todo el conjunto de caracteres recomendados (letras mayúsculas o minúsculas, números y caracteres especiales), sólo será segura en el 20% de los casos. Entre las secuencias de caracteres más populares que se encuentran en las contraseñas, podemos distinguir varios grupos:
- nombres: “ahmed”, “nguyen”, “kumar”, “kevin”, “daniel”;
- palabras populares: “forever”, “love”, “google”, “hacker”, “gamer”;
- contraseñas estándar: “password”, “qwerty12345”, “admin”, “12345”, “team”.
Las contraseñas que no contienen palabras del diccionario totalizaron el 43%. Entre ellas hay contraseñas débiles que constan, por ejemplo, de sólo letras mayúsculas o minúsculas y números (10%) o sólo números (6%). Sin embargo, si una contraseña incluye el conjunto recomendado: letras de distintas mayúsculas, caracteres especiales y números (esquema aA0!), entonces el 76% de esas contraseñas ya son seguras.
Conclusiones
Las GPU modernas son capaces de descifrar las contraseñas de los usuarios a una velocidad tremenda. Cualquier contraseña de hasta 8 caracteres puede descifrarse en menos de un día con el algoritmo de fuerza bruta más sencillo. Los algoritmos de hackeo pueden descifrar rápidamente incluso contraseñas largas. Utilizan diccionarios, consideran sustituciones de caracteres (“e” por “3”, “1” por “!”, o “a” por “@”) y secuencias populares (“qwerty”, “12345”, “asdfg”).
Este estudio de caso nos permite sacar las siguientes conclusiones sobre la resistencia de las contraseñas:
- Muchas contraseñas de usuario no son lo suficientemente seguras, ya que el 59% de ellas pueden descifrarse en una hora.
- Utilizar frases con sentido, nombres y secuencias de caracteres comunes en una contraseña reduce mucho el tiempo que se tarda en descifrarla.
- La contraseña menos segura es la que consiste enteramente de números o sólo palabras.
Para proteger sus cuentas e impedir que se descifren sus contraseñas:
- Recuerde que la mejor es una contraseña aleatoria generada por software. La función de generador de contraseñas está disponible en muchos gestores de contraseñas.
- Utilizar frases mnemotécnicas en lugar de combinaciones de frases con sentido.
- Compruebe la resistencia de su contraseña al hackeo. Puede hacerlo, por ejemplo, con Password Checker, Kaspersky Password Manager o la utilidad zxcvbn.
- Asegúrese de que sus contraseñas no figuren en las bases de datos filtradas. Esto puede hacerse en el sitio web haveibeenpwned. Utilice soluciones de seguridad que adviertan a sus usuarios de las fugas de contraseñas.
- No utilice la misma contraseña en varios servicios. Si sus contraseñas son todas diferentes, el que se descifre una de ellas tendrá menos consecuencias negativas.
Análisis de la solidez de las contraseñas de los usuarios