Una buena práctica es no restringir innecesariamente la longitud de la contraseña, de modo que se puedan usar frases de contraseña de un tamaño adecuado (quizás 35-45 caracteres para 6/7 palabras clave). (Consulte, por ejemplo, ¿Debo tener una longitud máxima de contraseña? donde se sugiere un máximo de 1 K para protegerse contra el DoS sin restringir la capacidad de los usuarios para establecer contraseñas largas.
bcrypt también se suele recomendar (ver, por ejemplo, Do ¿Algún experto en seguridad recomienda bcrypt para el almacenamiento de contraseñas? , enlace )
También se recomienda usar un salt (aleatorio, y almacenado con el hash de la contraseña). Creo que a menudo se recomiendan 32 bits (4 caracteres). (Entiendo que la lógica del tamaño de la sal es "suficiente para que el número de combinaciones sea mucho mayor que el número de registros del usuario Y es suficiente para hacer tablas del arco iris infactiblemente grandes": 16 bits son suficientes para la segunda parte, pero no pueden ser suficiente para el primero.)
Pero AIUI bcrypt solo hash 55 bytes, con 4 caracteres para la sal que deja 51 para la contraseña.
Supongo que no deberíamos simplemente bcrypt (izquierda (contraseña, 51)) e ignorar los últimos caracteres.
¿Deberíamos limitarnos a los usuarios a 50 caracteres en su contraseña (suficiente para casi todos, pero no definitivamente es suficiente)?
¿Deberíamos usar algo como bcrypt (sha256 (salt + contraseña)) en su lugar, y permitir hasta 1K caracteres? ¿O la adición del paso sha256 (o sha512?) Reduce la seguridad general de alguna manera?
¿Scrypt o PBKDF2 tienen restricciones de longitud similares?
(La última pregunta es solo por interés, realmente: me doy cuenta de que la dureza del espacio / FPGA-resistencia, y la relativa novedad de Scrypt, y la GPGPU-resistencia de bcrypt en comparación con PBKDF2 son consideraciones mucho más importantes a la hora de decidir cual hash para usar.)