¿Qué longitud máxima de contraseña para elegir al usar bcrypt?

31

Cuando generé la contraseña para GitHub con KeePass, recibí un mensaje en el sitio de GitHub que decía que el límite para la longitud de la contraseña es de 72 caracteres. Parecía extraño no ser una potencia de 2, así que busqué un poco en Google y me pareció que 72 es el máximo de bytes para el algoritmo de brypt. Por lo tanto, parece lógico restringir el número a 72, ya que las contraseñas más largas se truncarían a 72 de todos modos.

Luego generé una contraseña para Discord y parecía que la longitud máxima es de 128 caracteres. Pero pensé que verificaría si los primeros 72 caracteres de mi contraseña serían suficientes. Y sí, mi contraseña de 128 caracteres también se trunca a los 72 primeros, así que supongo que Discord también está usando bcrypt.

Entonces, la pregunta es, ¿es mejor establecer el límite de longitud de la contraseña en 72 caracteres o permitir que los usuarios elijan contraseñas más largas? (¿cuánto tiempo? 128, 256 bytes?) a pesar de que será truncado?

El primer criterio es seguridad y solo entonces la facilidad de uso, el almacenamiento o la dificultad de implementación.

    
pregunta user1 26.02.2017 - 19:59
fuente

2 respuestas

57

No estoy a favor del truncamiento silencioso porque confunde a los usuarios al pensar que su contraseña completa fue aceptada cuando no lo fue. Preferiría que un sistema simplemente configurara una longitud máxima, si fuera necesario, y restringiera al usuario a eso durante la introducción de la contraseña. Una mala situación que he escuchado es un cambio de código que comienza a procesar caracteres más allá la longitud máxima anterior y repentinamente la contraseña más larga que los usuarios no pueden iniciar sesión. El sistema solo tiene un registro de los primeros 72 caracteres y su cadena más larga no coincide con eso sin el truncamiento del sistema anterior. Eso lleva a usuarios frustrados.

Como alternativa al truncamiento de 72 caracteres, debe considerar pre-hashing la contraseña con algo como SHA-256. El permite que toda la cadena de contraseña del usuario, más allá de los 72 caracteres, se considere al mismo tiempo que proporciona la protección computacional de bcrypt.

    
respondido por el PwdRsch 26.02.2017 - 20:28
fuente
17

Por lo general, soy la persona que discute contra los límites estúpidos, pero me pregunto: ¿quién usa en serio contraseñas de más de 72 caracteres? Una contraseña tan larga sería muy poco práctica de escribir, por lo que es casi seguro que es un robot (o ctrl + v de un administrador de contraseñas). A los robots * y a los administradores de contraseñas no les importa si tienen que recordar cadenas alfanuméricas aleatorias en lugar de frases de contraseña.

Suponiendo que no utilicen caracteres especiales, es decir 26 + 26 + 10 = 62 posibilidades por carácter y digamos hasta 72 caracteres. Esto permite 62^72 = 1.13*10^129 de posibilidades. Al convertir a bits de entropía, un número mucho más manejable, obtenemos log(62^72)/log(2) = 428.7 bits de entropía.

La última vez que lo verifiqué, las claves de 256 bits se consideran razonables incluso después del cuántico, por lo que esto debería ser abundante .

En el raro caso de que sea una frase de contraseña, tomemos un diccionario muy estándar: el predeterminado en mi sistema Debian. Después de algunas podas estándar (insensibilidad a mayúsculas y minúsculas; eliminar variantes posesivas como "horse's" en lugar de "horse") contiene aproximadamente 50k palabras. Estoy menos seguro de estos cálculos, pero creo que esto significa que cada palabra, cuando se selecciona de forma aleatoria (como debería hacerse con las frases de contraseña), proporciona aproximadamente log(50000)/log(2)=15.6 bits de entropía. La longitud promedio de las palabras en general se considera 5 caracteres, más un espacio, por lo que 72 son aproximadamente 12 palabras.

Esto se reduce a 15.6*12 = 187.3 bits de entropía en una frase de contraseña de 72 caracteres. Como límite inferior, porque mi dictado no contiene todas las palabras. Yo diría que eres bueno.

El verdadero límite tonto son los 72 caracteres de bcrypt, pero si es con eso que tienes que trabajar, creo que es un límite razonable para los usuarios.

* Bien, bien, tal vez a los robots les importe. Pregúntame de nuevo cuando la Enmienda de Derechos de Robot esté allí.

Editar: estaba respondiendo el título. Para abordar otras preguntas en su publicación:

  

Entonces, la pregunta es: ¿es mejor establecer simplemente el límite de longitud de la contraseña en 72 caracteres o permitir que los usuarios elijan contraseñas más [...] largas aunque sean truncadas?

No trunques en silencio. No hay ventaja en esto. O recibirás solicitudes de soporte "boo-hoo, no puedo usar una contraseña de 105 caracteres" o, finalmente, alguien se dará cuenta "¡Dios mío, solo tengo que ingresar el primer 56% de mi contraseña para que funcione! ¿Qué es esta mierda ?! ??? ". Creo que el último realmente tiene un punto razonable y el primero será extremadamente raro (si alguna vez).

  

El primer criterio es la seguridad y solo entonces la usabilidad

Creo que podría interesarle conocer los certificados TLS del lado del cliente.

    
respondido por el Luc 26.02.2017 - 21:35
fuente

Lea otras preguntas en las etiquetas