Esta pregunta es una bifurcación de una pregunta anterior aquí: ¿Es seguro / prudente almacenar una sal en el mismo campo que la contraseña con hash?
Suponga que ejecuta un portal web y almacene las contraseñas en hash SHA1. ¿Cómo actualizar esto a hashes BCRYPT en su lugar?
Por lo general, esperarías a que los usuarios inicien sesión y vuelvan a codificar sus contraseñas (del texto sin formato que ingresaron) a BCRYPT. Pero podría pasar un tiempo antes de que todos los usuarios inicien sesión en su plataforma, y siempre habrá usuarios inactivos que nunca volverán.
Una propuesta separada (que escuché por primera vez de Troy Hunt) fue BCRIPTA las contraseñas SHA1 existentes en su base de datos. Efectivamente serías BCRYPT(SHA1(plaintext_password))
. De esta manera, todos los usuarios del sistema se actualizan a BCRYPT a la vez, independientemente de su actividad.
De esta manera, una infracción en su base de datos, no expone a los usuarios que aún no han iniciado sesión y siguen en SHA1.
La pregunta es:
- Es
BCRYPT(SHA1(plaintext_password))
es equivalente en seguridad aBCRYPT(plaintext_password)
- Si no, ¿por qué? ¿Y es la diferencia lo suficientemente razonable como para considerar esta opción?
La pregunta se enfoca en BCRYPT (SHA1), pero podría aplicarse fácilmente a cualquiera de los dos algoritmos hash con el más fuerte aplicado último.