Estoy trabajando para mejorar un CMS en el que la implementación actual de la contraseña de almacenamiento es solo sha1(password)
. Le expliqué a mi jefe que hacerlo de esa manera es increíblemente inseguro y le dije que deberíamos cambiar a bcrypt, y él estuvo de acuerdo.
Mi plan era simplemente ejecutar todos los hashes existentes a través de bcrypt y almacenarlos en el campo de la contraseña, y luego usar el siguiente psudo-código para verificar la contraseña: correctPassword = bcrypt_verify(password, storedHash) or bcrypt_verify(sha1(password), storedHash)
.
De esta manera, los usuarios nuevos o los usuarios que cambian sus contraseñas obtendrán hash bcrypt "reales", mientras que los usuarios existentes no tendrán que cambiar sus contraseñas. ¿Hay alguna desventaja para hacer esto? Si bien probablemente sería ideal pedir a todos los usuarios que elijan una nueva contraseña, ¿perdemos mucho en la seguridad al hacer esto?
Estaba pensando que incluso si un atacante tuviera acceso tanto a la base de datos como al código, el craqueo no sería sustancialmente más rápido incluso si la mayoría de la "entrada" a bcrypt era una cadena hexagonal de 40 caracteres, ya que la parte lenta ( bcrypt_verify()
) aún debe invocarse para cada intento de contraseña en cada usuario.