Это проблема, с которой у меня уже есть приемлемый ответ - поэтому я публикую здесь, чтобы узнать, может ли кто-нибудь ее улучшить.Создание зашифрованных паролей в mysql, для заполнения базы данных django
Я переношу данные клиента из старой системы на заказ (база данных mysql с открытыми паролями!) В django. Перенос данных должен выполняться исключительно с помощью набора сценариев sql, которые можно запускать с обеих баз данных (перемещение и преобразование данных из старой базы данных в новую). Процесс должен быть повторяемым, предсказуемым и потенциально способным работать без присмотра.
Мне нужно взять существующие пароли, зашифровать и сохранить их в формате, приемлемом для Django (см. Подробности here). В идеале я бы использовал предпочтительный хэшер PBKDF2 из django, но это сложно, поскольку я не могу легко имитировать растяжение пароля/множественные итерации, которые делает PBKDF2.
Моим обходным решением на данный момент является солить и зашифровать пароли открытого текста, используя SHA1, и сохранить их в Django. Затем при первом входе в систему пользователь Django автоматически обновляет шифрование паролем до PBKDF2.
Я хотел использовать SHA2/SHA256 для этого, но Django не поддерживает это без PBKDF2, по крайней мере, если я не напишу свой собственный хэш-файл и не добавлю его в django settings.py - который кажется много усилия.
Таким образом, я пришел к следующему в моей миграции SQL скрипт (упрощенно для ясности):
insert into auth_user(username,password)
SELECT username
, CONCAT(
'sha1$',
@salt := SUBSTRING(MD5(RAND()) FROM 1 FOR 12),
'$', SHA1(CONCAT(@salt,password))
) AS password
FROM
old_user_table;
, который выводит строки пароля, как это:
sha1$a6acb1163c50$e7225b82280d66b4d8125cb7817b7854e98a5657
До сих пор это работает treat - пользователи могут войти в систему, и шифрование будет тихо обновляться. Единственным недостатком является то, что мы используем относительно небезопасный алгоритм SHA1, по крайней мере, до тех пор, пока пользователь не войдет в систему один раз.
Можно ли улучшить это решение?
Это хорошая идея, хотя это не соответствует моему требованию, что все может быть выполнено за один проход с помощью набора сценариев sql. Спасибо в любом случае! –
Я не привязан к вашей среде, и причина для ограничения, однако, что-то должно вызывать mysql для запуска сценария миграции sql ... что-то может быть скриптом Python, который запускает код, похожий на вышеупомянутую пост-миграцию , – mhawke
Без ограничений, я просто не хочу добавлять код в проект django и разбираться с развертываниями и т. Д. Сейчас процесс миграции является чистым sql и, следовательно, легко запускается независимо от команды разработчиков. Я просто запускаю его из моего любимого GUI mysql (SQlyog). Ваше решение по-прежнему хорошее, оно просто не подходит для того, что я хочу делать. Но я все равно могу его реализовать! –