ruby-on-rails-3 encryption devise md5 hash

ruby on rails 3 - Migra contraseñas antiguas de md5 a contraseñas de bcrypt



ruby-on-rails-3 encryption (4)

Deberá solicitar al usuario que inicie sesión con la contraseña anterior y luego cambiarla, por ejemplo, mostrar una página de cambio de contraseña obligatoria que almacenará la contraseña usando bcrypt. Una vez que se proporcione la nueva contraseña, podrá desactivar / eliminar la contraseña anterior en su sistema.

Estoy reelaborando un sitio web en Rails utilizando Devise para la autenticación. El sitio web anterior trabaja con una base de datos de usuarios con contraseñas de md5 y, por lo tanto, deseo migrar estas contraseñas al cifrado que utiliza. ¿Cómo lo resuelvo?


No hay forma de convertir un hash md5 en otro tipo de hash. Tendrá que hacer que los usuarios inicien sesión utilizando el sistema anterior, y luego codifiquen la contraseña que proporcionan con el nuevo método. Una vez que tenga el nuevo hash, puede eliminar el hash antiguo, md5.


Oleksi y josnidhin hicieron un gran trabajo al responder tu pregunta. Solo quería agregar algunas ideas sobre qué hacer durante la fase de transición:

Migre la base de datos para tener dos columnas de "hash de contraseña", una que contenga los hashes MD5 antiguos existentes y otra para los hashes bcrypt nuevos, inicialmente todos rellenados con NULL. La próxima vez que un usuario inicie sesión, realice estos pasos:

1) Compruebe si ya hay un valor en la columna bcrypt. Si es así continúe con 3., si no con 2.

2) Autentique al usuario con el antiguo mecanismo MD5 usando el valor de la columna MD5. Si tiene éxito, adicionalmente calcule el nuevo hash bcrypt y almacénelo en la nueva columna. Hecho.

3) Autenticar al usuario utilizando el valor brypt. Simplemente ignora el valor MD5.

Luego, de vez en cuando, verifique si la nueva columna bcrypt está llena. Si es así, descarte la columna MD5 y actualice su aplicación para usar solo el nuevo mecanismo.

Pero eso es una ilusión, siempre hay algunos usuarios que no han iniciado sesión mientras tanto. Envíeles un correo electrónico diciéndoles lo que está haciendo, que es lo mejor para ellos y pídales que inicien sesión pronto.

Después de un par de semanas, verifique nuevamente el estado de bcrypt. Si aún faltan algunas contraseñas (habrá :)), lo que podría hacer es simplemente restablecer las contraseñas de estos usuarios, generar una aleatoria e informarles por correo, de manera muy similar a lo que haría si se les olvidara la contraseña.

Luego, finalmente puede purgar la columna MD5, descartar el código correspondiente y actualizar su aplicación para usar solo la nueva autenticación.


Tengo una solución alternativa:

  1. Añadir la columna bcrypt.
  2. Rellene la columna bcrypt ejecutando hash MD5 a través del algoritmo bcrypt.
  3. Cambie el inicio de sesión para usar siempre la columna bcrypt y la función de hashing que es plain text->md5->bcrypt .

De esta manera, todas las contraseñas se pueden migrar a la vez y los hashes MD5 se descartan permanentemente. Teniendo en cuenta hacer esto por mí mismo, no puedo detectar ningún error con esta idea. ¿Ningún arrendatario? ¿Me estoy perdiendo algo obvio?