¿Cuál es el uso de hacer que los usuarios usen dígitos, una combinación de mayúsculas y una contraseña en minúscula si las contraseñas están encriptadas?

-3

Algunos sitios web, incluso StackOverflow, solicitan al menos 1 dígito, 1 carácter en mayúscula en la contraseña. ¿Importa esto realmente cuando el desarrollador utiliza un algoritmo hash de contraseña para almacenar las contraseñas en la base de datos?

Estoy construyendo un proyecto donde la seguridad realmente importa, pero los usuarios son tercos para usar contraseñas débiles. Quiero motivarlos a usar contraseñas seguras usando reglas que realmente importan y educándolas sobre las razones de tales requisitos.

¿Es suficiente para evitar los números de teléfono, su propio nombre o las palabras del diccionario? ¿Por qué no?

    
pregunta Mr. Alien 18.01.2013 - 09:24
fuente

3 respuestas

6

Independientemente del hashing, la debilidad inherente de las contraseñas es que son elegidas y recordadas por los humanos. Los humanos no son buenos en tales trabajos. Escogerán y recordarán las contraseñas de un conjunto bastante pequeño de posibles contraseñas, es decir, palabras que "tienen sentido" de una forma u otra. Un atacante con una computadora puede probar todas las "contraseñas plausibles" a la velocidad de su computadora , que puede ser increíblemente rápida en ese trabajo (hasta varios miles de millones por segundo con una PC de juegos lista para usar) ). Esto se denomina ataque de diccionario .

Requerir la adición de un dígito y una combinación de letras mayúsculas / minúsculas es un intento de forzar a los usuarios humanos a ampliar su conjunto de contraseñas posibles. Hay más contraseñas posibles que consisten en una palabra significativa + un dígito, que contraseñas posibles que consisten en una palabra significativa (exactamente diez veces más).

(Estas reglas suelen ser contraproducentes. Al solicitar un dígito adicional, la mayoría de los usuarios agregarán un '1' y lo agregarán al final, lo que significa que no se ampliará el conjunto de posibles contraseñas; la longitud adicional incita a los usuarios para elegir una palabra más corta de una lista más corta, por lo que en realidad reduce el tamaño del conjunto de contraseñas potenciales.)

Hashing es un sistema de defensa de segunda capa, destinado a frustrar a los atacantes que podrían parcialmente violar el servidor, y obtuvo un pico en la base de datos de contraseñas almacenadas. El tamaño del conjunto de contraseñas potenciales es importante independientemente del hashing. Cuando el atacante tiene acceso a la contraseña con hash, puede ejecutar un ataque de diccionario offline , donde cada "intento" es solo una cuestión de calcular la función hash. Esto facilita la tarea para el atacante (en lugar de tener que hablar con el servidor para cada intento, que es un ataque de diccionario en línea ) pero no cambia el concepto principal, que es el que los usuarios deben usar contraseñas de un conjunto grande .

    
respondido por el Thomas Pornin 27.02.2013 - 19:21
fuente
1

La complejidad aún agrega seguridad. @Thomas Pornin tiene razón en su respuesta, pero me gustaría ofrecer una manera diferente de pensar en ello.

Supongamos que estamos haciendo hash. ¿Qué tan resistente es atacar?

  1. Superior / inferior / especial / símbolos (aproximadamente 84 valores potenciales IIRC)?
  2. Superior / inferior / números (64 símbolos)?
  3. Números hexadecimales (16 símbolos)?
  4. Números decimales (10 símbolos)?
  5. números binarios (2 símbolos)?

Obviamente el caso # 5 es reductio ad absurdium; todos deben aceptar que 2 símbolos son insuficientes Queremos que el conjunto de símbolos sea tan complejo como podamos hacerlo sin imponer una penalización indebida a los usuarios u otros elementos del sistema.

    
respondido por el Mark C. Wallace 27.02.2013 - 19:55
fuente
1

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:

respondido por el Polynomial 27.02.2013 - 19:59
fuente

Lea otras preguntas en las etiquetas