Hace poco me di cuenta del hecho de que bcrypt trunca las contraseñas a 72 caracteres. En la práctica, mi intuición es que esto no plantea ningún problema de seguridad importante. Sin embargo, entiendo que significa que cualquier biblioteca de software que use bcrypt posiblemente sufra un "error" en el que dos contraseñas ultra largas que comiencen con los mismos 72 caracteres serán equivalentes.
Los autores del marco web de Django escribieron algo llamado BCryptSHA256PasswordHasher
para resolver este problema; lo que hace es primero hash de las contraseñas de los usuarios con SHA256 antes de pasarlas a bcrypt.
Algunos desarrolladores de mi equipo estaban debatiendo los méritos de este enfoque y solo quería recopilar ideas de la comunidad en general. Por un lado, ¿no es esto, en cierto sentido, reducir la seguridad al reducir el espacio total de posibles valores que se introducen en bcrypt? SHA256 siempre generará 32 bytes, muy por debajo de los 72 (significativos) bytes que tendríamos de otro modo. Por otro lado, sin hash de contraseñas primero, esencialmente tenemos un espacio distribuido de manera desigual donde, por cada prefijo de 72 caracteres, todas las contraseñas que comienzan con ese prefijo chocan.
Mi intuición es que el problema de distribución de más de 72 bytes no es importante y que BCryptSHA256PasswordHasher
realmente no es útil. Dicho esto, también reconozco que, en general, los marcos que son tan populares y ampliamente utilizados como Django tienden a tomarse estas cosas en serio y tienen buenas razones detrás de sus decisiones. Así que realmente no tengo mucha confianza en mi instinto, si eso tiene sentido.
¿Estoy equivocado? ¿Las contraseñas de hash con SHA256 antes de bcrypt no reducen la seguridad, incluso teóricamente? ¿Es el problema de distribución más grave de lo que me doy cuenta? ¿Hay algo más en lo que simplemente no estoy pensando?