Aquí hay dos categorías de riesgo importantes:
- Ataques en el sistema en vivo (por ejemplo, adivinar la contraseña de un usuario)
- Ataques a hashes de contraseña sin conexión (por ejemplo, desde un volcado de base de datos)
El primer tipo de ataque se puede dividir en varias subcategorías:
- Un ataque de fuerza bruta en la contraseña de un usuario.
- Adivinando las 1000 contraseñas más utilizadas en la cuenta de un usuario.
- Adivinando las 3 contraseñas más utilizadas en las cuentas de 1000 usuarios.
Los requisitos de complejidad de las contraseñas resuelven en gran medida las dos últimas categorías y hacen que el ataque de estilo de fuerza bruta sea mucho más difícil. Cuando se combinan con una limitación de velocidad adecuada, las tres categorías se pueden hacer inviables de manera efectiva. Tradicionalmente, los ataques de "sistema en vivo" eran el principal controlador para requisitos de contraseña más fuertes.
El segundo tipo de ataque generalmente ocurre después de que su servidor está en peligro. A pesar de las mejores intenciones y esfuerzos de todos, los sitios y los servidores son hackeados. No puedes protegerte de todos los posibles vectores de ataque, y eso es un hecho en el mundo de la seguridad. Serás hackeado en algún momento.
Hay tres problemas principales con el robo de un volcado de base de datos:
- Los datos privados del usuario se filtran, a menudo consisten en información personal.
- Las contraseñas de los usuarios se filtran, ya sea como texto simple (¡si no estás haciendo tu trabajo!) o como un hash.
- Los usuarios reutilizan las contraseñas en diferentes servicios.
No puede evitar que los datos privados del usuario se filtren. El intento de encriptar u ofuscar de manera reversible los datos en la base de datos solo conduce a una capa de abstracción complicada en su código, y proporciona poco o ningún beneficio de seguridad. Lo mejor que puede hacer es realizar pruebas rigurosas de garantía de calidad y pruebas de seguridad en sus productos, servicios e infraestructura, a fin de minimizar el riesgo de que le roben los datos.
Sin embargo, usted puede proteger las contraseñas de los usuarios. Al codificar las contraseñas con una función criptográfica de un solo sentido, podemos dificultar que un atacante descubra la contraseña original de texto sin formato.
Se descubrió que las técnicas estándar que usan MD5 o SHA1 solo son defectuosas, ya que las bases de datos grandes (llamadas tablas de arco iris) se pueden calcular previamente de antemano, lo que permite a un atacante buscar un valor de hash en una tabla y encontrar su correspondiente plano Contraseña de texto. Esta técnica se combatió con sales, cuyo objetivo es hacer que cada hash sea único para el usuario mediante la introducción de un valor aleatorio único por usuario, lo que hace que las tablas del arco iris no sean factibles. Posteriormente, los atacantes descubrieron que las funciones de hash podían computarse de forma altamente paralela mediante GPU, utilizando tecnologías como OpenCL y CUDA. En lugar de unos pocos millones de hashes por segundo en la CPU, los atacantes ahora pueden calcular miles de millones de hashes por segundo en una GPU, o cientos de miles de millones por segundo en un clúster de GPU, todos utilizando nada más que hardware de consumo estándar y libremente. software disponible Esto significa que un tipo de hash sha256(pass+salt)
puro ya no es seguro. La alternativa es un algoritmo de derivación de clave diseñado para ser lento, como PBKDF2 o bcrypt. Estos son más difíciles de calcular en dispositivos paralelos como las GPU, y reducen el número de cálculos por segundo hasta un nivel que hace inviable la fuerza bruta total. Sin embargo, los ataques de diccionario seguirán siendo razonablemente factibles, especialmente si se usan contraseñas comunes.
Entonces, para concluir: no , no creo que estemos poniendo demasiado peso en los requisitos de complejidad de las contraseñas. Los vectores de ataque involucrados son complicados, y el poder de cómputo disponible para las personas hoy en día es lo suficientemente alto como para hacer que las contraseñas comunes sean peligrosas, sin importar qué tan lenta y computacionalmente costosa sea la función de obtención de claves. Los usuarios reutilizan las contraseñas, por lo que debemos protegerlas lo mejor que podamos.