¿Tiene bcrypt una longitud máxima de contraseña?

71

Hoy estuve jugando con bcrypt y noté algo:

hashpw('testtdsdddddddddddddddddddddddddddddddddddddddddddddddsddddddddddddddddd', salt)
Output: '$2a$15$jQYbLa5m0PIo7eZ6MGCzr.BC17WEAHyTHiwv8oLvyYcg3guP5Zc1y'

hashpw('testtdsdddddddddddddddddddddddddddddddddddddddddddddddsdddddddddddddddddd', salt)
Output: '$2a$15$jQYbLa5m0PIo7eZ6MGCzr.BC17WEAHyTHiwv8oLvyYcg3guP5Zc1y'

¿Tiene bcrypt una longitud máxima de contraseña?

    
pregunta d0ctor 31.07.2013 - 15:19
fuente

3 respuestas

61

Sí, bcrypt tiene una longitud máxima de contraseña. El artículo original contiene esto:

  

el argumento clave es una clave de cifrado secreta, que puede ser una contraseña elegida por el usuario de hasta 56 bytes (incluido un byte cero de terminación cuando la clave es una cadena ASCII).

Por lo tanto, se podría inferir una longitud de contraseña de entrada máxima de 55 caracteres (sin contar el cero de terminación). Los caracteres ASCII, tenga en cuenta que: un carácter Unicode genérico, cuando se codifica en UTF-8, puede utilizar hasta cuatro bytes; y el concepto visual de un glyph puede consistir en un número ilimitado de caracteres Unicode. Ahorrarás muchas preocupaciones si restringes tus contraseñas a ASCII simple.

Sin embargo, existe una cantidad considerable de confusión sobre el límite real. Algunas personas creen que el límite de "56 bytes" incluye una sal de 4 bytes, lo que lleva a un límite inferior de 51 caracteres. Otras personas señalan que el algoritmo, internamente, administra las cosas como 18 palabras de 32 bits, para un total de 72 bytes, por lo que podría ir a 71 caracteres (o incluso a 72 si no administra las cadenas con un cero de terminación).

Las implementaciones > reales tendrán un límite que depende de lo que el implementador creyó y aplicó en todo lo anterior. Todas las implementaciones decentes le permitirán al menos 50 caracteres. Más allá de eso, el soporte no está garantizado. Si necesita admitir contraseñas de más de 50 caracteres, puede agregar un paso de hashing preliminar, como se explica en en esta pregunta (pero, por supuesto, esto significa que ya no computas" the "bcrypt, sino una variante local, por lo que la interoperabilidad se desintegra) .

Editar: me han señalado que aunque, desde el punto de vista de un criptógrafo, el artículo es la referencia definitiva, no es necesariamente así como los diseñadores pensé en eso. La implementación "original" podría procesar hasta 72 bytes. Dependiendo de su postura sobre el formalismo, puede afirmar que la implementación es correcta y que el artículo es incorrecto. De todos modos, tal es el estado actual de las cosas que mi consejo sigue siendo válido: si mantienes menos de 50 caracteres, estarás bien en todas partes. (Por supuesto, hubiera sido mejor si el algoritmo no tuviera una limitación de longitud en primer lugar).

    
respondido por el Tom Leek 31.07.2013 - 15:34
fuente
15

Sí, BCrypt tiene un límite superior de 72 caracteres. Es una limitación del propio Blowfish. Una forma de solucionarlo es utilizar SHA-256 primero y luego, a continuación, BCrypt el resultado. En tu caso sería algo así como

hashpw(sha256('pass'), salt)
    
respondido por el Adi 31.07.2013 - 15:35
fuente
6

tl; lr: BCrypt está limitado a 72 bytes, no a 56.

Fondo

BCrypt está limitado a 72 bytes. El documento original también menciona el uso de un terminador nulo. Esto significa que generalmente se limitaría a:

  • 71 caracteres + 1 byte terminador nulo

Pero la revisión de BCrypt 2a especifica el uso de la codificación UTF-8 (mientras que el documento técnico original se refiere a ASCII). Cuando se usa UTF-8, un carácter no significa un byte, por ejemplo:

  • Noël tiene cuatro caracteres, pero cinco bytes ( N o e ¨ l )
respondido por el Ian Boyd 19.04.2018 - 20:07
fuente

Lea otras preguntas en las etiquetas