2008-12-25 49 views
15

Véase también What is the best way to check the strength of a password?¿cómo se calcula la complejidad de la contraseña?

Algunas aplicaciones (o sitios web) calculan la complejidad de una contraseña cuando la escribe. Suelen mostrar una barra roja que se vuelve naranja, luego verde, y aún más verde a medida que su contraseña se alarga, y contiene más clases de caracteres (es decir, minúsculas, mayúsculas, puntuación, dígitos ...)

Aquí está el algoritmo I utilizar.

private int GetPasswordComplexity(string password) 
     { 
      if (password.Length <= 4) 
       return 1; 

      int complexity = 0; 

      int digit = 0; 
      int letter = 0; 
      int cap = 0; 
      int other = 0; 


     for (int i = 0; i < password.Length; i++) 
     { 
       if (char.IsDigit(password[i]) && i!=password.Length-1) 
       digit = 1; 
      else if (char.IsLower(password[i])) 
       letter = 1; 
      else if (char.IsUpper(password[i]) && i!=0) 
       cap = 1; 
      else 
       other = 1; 
     } 

      complexity = digit + letter + cap + other; 

      if (password.Length <= 7) 
       complexity = Math.Min(3, complexity); 

      return complexity; 
     } 

Me preocupa el hecho de que mi algoritmo calificaría "Password1!" como "muy fuerte" y "] @ feé: m" como "débil" porque solo tiene 7 caracteres de largo.

EDIT: He actualizado ligeramente el algoritmo para ignorar las letras mayúsculas y los dígitos cuando son, respectivamente, el primer y el último carácter de la contraseña.

¿Alguien aquí tiene experiencia con este tipo de problemas? ¿Cómo agregarías un diccionario para detectar palabras comunes?

Respuesta

26

Usar algo como cracklib es muy bueno si puede permitirse el tiempo de verificar contra todas las posibles reglas. Si solo quieres algo rápido, digamos para un medidor de fuerza basado en JavaScript, entonces considera estimar el número de posibles conjeturas que se requerirían para un ataque de fuerza bruta. Para cada tipo de carácter visto actualice un multiplicador basado en el número de caracteres potenciales de ese tipo. Entonces, si solo tiene dígitos, entonces el multiplicador sería 10. Si solo tiene minúscula, entonces el multiplicador es 26. Si ambos, entonces el multiplicador es 36, es decir, para cada carácter de la contraseña, un ataque de fuerza bruta necesita probar hasta 36 personajes diferentes. Una contraseña que contenga caracteres en mayúscula y minúscula, dígitos y puntuación, entonces tendría un multiplicador de 10 + 26 + 26 + 32 = 94 (más o menos dependiendo de la puntuación permitida).

Para estimar el número promedio de permutaciones que tomaría un método de fuerza bruta, eleve el multiplicador a la potencia igual al número de dígitos en la contraseña. Esto le da una cantidad promedio de conjeturas que tomaría romper la contraseña usando un ataque de fuerza bruta. Supongamos que cada conjetura toma un ciclo de CPU y, dado el procesador más rápido, calcule cuánto tiempo llevaría romper una contraseña dado un cierto número de permutaciones. Por ejemplo, si mi multiplicador fuera 10 y la contraseña tuviera 10 caracteres, entonces tendría 10,000,000,000 combinaciones posibles. En el procesador 3GHz, esto debería tomar 10/3 * k o 3k segundos (donde k es el número de ciclos por adivinar, típicamente pequeño). Claramente, esta es una contraseña débil.

Ahora, establezca algunos rangos que representen fortalezas de contraseña razonables. Por ejemplo, si cree que una contraseña de 8 caracteres con caracteres en minúsculas y minúsculas es mínima para la fuerza media, entonces su corte sería de 52^8 o aproximadamente de 1.5 años en un procesador 3GHz (suponiendo que k = 1). Si agrega dígitos, entonces el límite se convierte en 62^8 o aproximadamente 8 años en un procesador 3GHz.

Para ponerlo en uso, solo necesita realizar un seguimiento de los tipos de caracteres que ve, construir el multiplicador adecuado, calcular las permutaciones esperadas en función de la longitud de la contraseña y compararlas con los límites predefinidos para determinar qué fuerza contraseña tiene.

+0

Descripción absolutamente genial. ¡Muchas muchas gracias! –

+0

Buenas ideas. Pero: Complejidad ("PasswordPassword") = 52^17 = 1.5^10^29 Complejidad ("!:^DE1") = 94^6 = 6x10^11 Ahora, ¿qué contraseña es más fuerte? – Brann

+0

Es solo una medida aproximada. También es probable que desee también seleccionar las contraseñas más comunes. http://www.modernlifeisrubbish.co.uk/article/top-10-most-common-passwords http://lawprofessors.typepad.com/law_librarian_blog/2007/05/10_most_common_.html – tvanfosson

3

No me limitaré a marcar una bandera cuando vea un dígito, mayúscula, etc., pero le doy algunos puntos. Algo así como un sistema de puntuación. Una letra normal cuenta 1, un dígito 2 y un carácter especial 3.

Ahora su número total da cuenta del número de caracteres y de cómo se compone la contraseña. Solo tiene que trazar líneas para lo que es débil y lo que es fuerte.

+0

La entropía agregada por un carácter especial es menor que la de un dígito. La entropía añadida por un dígito es menor que la de un personaje. Deberías calcular la entropía. – Mausy5043

8

Recomiendo usar cracklib para esto.

+0

Puede obtener los enlaces de python aquí: http://www.nongnu.org/python-crack/ –

0

También debe consultar un diccionario. Creo que Apple hace esto en su comprobador de contraseñas incorporado.

1

Escribí una pequeña aplicación de Javascript (GPL). Eche un vistazo: Yet Another Password Meter. Puede descargar la fuente y usarla/modificarla bajo GPL.

1

This link hace exactamente esto, con una explicación detallada de los criterios utilizados.

Cuestiones relacionadas