Hay tres tipos principales de ataques que se pueden realizar contra hash: ataques de fuerza bruta, ataques de diccionario y ataques de precálculo.
Ataques de fuerza bruta
Un ataque de fuerza bruta implica seleccionar un rango de caracteres (por ejemplo, minúsculas y números) y calcular el hash para cada posible permutación de esos caracteres, para un rango de longitudes de contraseña. Cada hash se compara con su hash de destino y, si coincide, se ha encontrado la contraseña. Por ejemplo, podríamos elegir a-z A-Z 0-9
como nuestro alfabeto para las contraseñas entre 5 y 8 caracteres. La defensa contra tales ataques depende del costo computacional de cada operación de hash, el alfabeto necesario para atacar con éxito la contraseña y la longitud de la contraseña. Dado que la tecnología moderna permite una aceleración de hash basada en GPU, es importante utilizar una función de derivación de clave lenta (por ejemplo, PBKDF2 o bcrypt) en lugar de un solo hash.
Ataques de diccionario
Los ataques de diccionario implican ejecutar una gran lista de palabras preseleccionadas que probablemente se usarán como contraseñas. Es importante tener en cuenta que la mayoría de los diccionarios no solo incluyen palabras reales del diccionario, sino que también incluyen varias pseudo palabras y otros valores que se encuentran en varias fugas de la base de datos y listas de contraseñas comunes. Estos ataques son más eficientes que los ataques de fuerza bruta en general, porque se centran en el tipo de contraseñas que los humanos eligen en lugar de valores completamente aleatorios. La defensa contra tales ataques se basa casi en su totalidad en no elegir una contraseña o palabra de diccionario comunes.
Ataques previos al cálculo
En lugar de calcular los hashes repetidamente y compararlos con el hash de destino, los ataques de precálculo implican que los hashes se calculen para un conjunto de valores elegidos (como un ataque de diccionario) y se almacenen en un archivo o base de datos. Las bases de datos de hash y las tablas de arco iris son dos métodos comunes para hacer esto. Esto proporciona una búsqueda muy rápida de texto sin formato para cualquier hash conocido, ya que es solo un caso de buscar el hash en el índice y devolver el texto sin formato asociado. Se puede defender contra esto utilizando un salt, es decir, un valor aleatorio añadido a la contraseña antes de realizar el hash. Esto hace que la computación de las tablas de arco iris para cada valor de sal posible sea completamente inviable.
Entonces, ¿por qué son importantes las contraseñas complicadas? Depende, de verdad. Si está haciendo el hashing de contraseñas correctamente, utilizando PBKDF2 o bcrypt con un factor de costo razonable, la complejidad más allá de no usar contraseñas comunes no es tan importante como en realidad . Es más importante evitar las palabras del diccionario y las contraseñas comunes, y las contraseñas complejas generalmente ofrecen ese tipo de protección. Sin embargo, la elección de una contraseña larga y poco común que no sea del diccionario y que sea memorable (por ejemplo, PolynomialLovesBacon
) funciona igual de bien. Si realiza el hashing de contraseñas incorrectamente (por ejemplo, SHA1 con sal) necesita una contraseña mucho más sólida para permanecer seguro, ya que las GPU pueden calcular decenas de miles de millones de hashes por segundo.
Por supuesto, vas a tener que lidiar con los aspectos humanos. Creo que una de las mejores cosas que puede hacer es advertir a los usuarios si usan una contraseña común, almacenando una lista de las ~ 2000 más comunes (puede obtener listas de éstas en línea) y verificarlas. ellos. Siempre y cuando tenga las contraseñas de hash correctamente, la mayoría de los usuarios deberían estar razonablemente seguros incluso en el caso de una pérdida de la base de datos.
La mayoría de estos ataques se basan en el modelo de su sitio que está siendo pirateado y sus contraseñas robadas, por ejemplo. a través de la inyección de SQL, por lo que es importante adherirse a las prácticas de codificación seguras y estar al tanto de las vulnerabilidades comunes.
Lectura adicional: