2014-10-22 2 views
2

Это проблема, с которой у меня уже есть приемлемый ответ - поэтому я публикую здесь, чтобы узнать, может ли кто-нибудь ее улучшить.Создание зашифрованных паролей в 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, по крайней мере, до тех пор, пока пользователь не войдет в систему один раз.

Можно ли улучшить это решение?

ответ

1

У вас есть пароли открытого текста, поэтому вы можете написать простой скрипт, который выполняет итерацию через всех ваших пользователей и аутентифицирует их. Запустите это после вашего sql-скрипта миграции, и это обновит пароль каждого пользователя до того, как вы выставите его реальным пользователям, облегчив вашу озабоченность по поводу снижения безопасности.

from django.contrib.auth import authenticate 

for username, password in get_usernames_and_passwords(): 
    if authenticate(username=username, password=password) is None: 
     print "Failed to authenticate user {!r}".format(username) 
+0

Это хорошая идея, хотя это не соответствует моему требованию, что все может быть выполнено за один проход с помощью набора сценариев sql. Спасибо в любом случае! –

+0

Я не привязан к вашей среде, и причина для ограничения, однако, что-то должно вызывать mysql для запуска сценария миграции sql ... что-то может быть скриптом Python, который запускает код, похожий на вышеупомянутую пост-миграцию , – mhawke

+0

Без ограничений, я просто не хочу добавлять код в проект django и разбираться с развертываниями и т. Д. Сейчас процесс миграции является чистым sql и, следовательно, легко запускается независимо от команды разработчиков. Я просто запускаю его из моего любимого GUI mysql (SQlyog). Ваше решение по-прежнему хорошее, оно просто не подходит для того, что я хочу делать. Но я все равно могу его реализовать! –

Смежные вопросы