Я перерабатываю сайт в Rails, используя Devise для аутентификации. Предыдущий веб-сайт работает с базой данных пользователей с паролями md5, и поэтому я хочу перенести эти пароли на шифрование, использующее Devise. Как его решить?
Перенос старых паролей md5 на пароли bcrypt
Ответ 1
Олекси и Йоснидхин отлично справились с ответом на ваш вопрос. Я просто хотел добавить некоторые идеи, что делать на этапе перехода:
Перенесите БД в два столбца "хэш пароля", один из которых содержит существующие хеши MD5, а другой - для новых хэшей bcrypt, изначально все заполненные NULL. В следующий раз, когда пользователь войдет в систему, выполните следующие действия:
1) Проверьте, есть ли значение в столбце bcrypt. Если так, продолжайте с 3., иначе с 2.
2) Аутентифицируйте пользователя с помощью старого механизма MD5, используя значение из столбца MD5. В случае успеха дополнительно вычислите новый хэширование bcrypt и сохраните его в новом столбце. Готово.
3) Аутентифицируйте пользователя, используя значение brypt. Просто игнорируйте значение MD5.
Затем время от времени проверяйте, заполнен ли новый столбец bcrypt. Если это так, отбросьте столбец MD5 и обновите приложение, чтобы использовать только новый механизм.
Но это принятие желаемого за действительное, всегда есть некоторые пользователи, которые еще не вошли в систему. Отправляйте им сообщение, сообщающее им, что вы делаете, чтобы оно было наилучшим образом и попросите их добровольно войти в систему в ближайшее время.
Через пару недель снова проверьте статус bcrypt. Если все еще будут отсутствовать какие-либо пароли (будет:)), то вы можете сделать только reset пароли этих пользователей, создать случайный номер и сообщить об этом по почте, как и то, что вы сделали бы, если бы они забыли свои пароли.
Затем вы можете, наконец, очистить столбец MD5, отбросить соответствующий код и обновить приложение, чтобы использовать только новую аутентификацию.
Ответ 2
У меня есть альтернативное решение:
- Добавить столбец bcrypt.
- Заполните столбец bcrypt, выполнив хеш MD5 с помощью алгоритма bcrypt.
- Измените логин на всегда, используя столбец bcrypt и функцию хеширования
plain text->md5->bcrypt
.
Таким образом, все пароли могут быть перенесены сразу, а хеши MD5 будут отброшены навсегда. Учитывая это, я не могу выбрать недостатки этой идеи. Любые берущие? Мне что-то не хватает?
Ответ 3
Невозможно преобразовать хеш md5 в другой вид хэша. Вам нужно будет заставить пользователей войти в систему, используя старую систему, а затем хэш-пароль, который они дают, используя новый метод. Когда у вас новый хеш, вы можете удалить старую хеш-память md5.
Ответ 4
Вам нужно будет попросить пользователя войти в систему, используя старый пароль, а затем изменить его, например, показать страницу обязательного изменения пароля, в которой будет храниться пароль с помощью bcrypt. После ввода нового пароля вы можете отключить/удалить старый пароль в вашей системе.