Можно ли создавать пароли Django с помощью Perl?

Итак, на меня свалился срочный проект по объединению пользовательской базы данных MySQL с существующей пользовательской базой данных Django.

Я понял почти все, кроме того, как обращаться с паролями, поскольку они используют разные хэши. Я не знаю Python, бэкэнд Django или очень мало знаю о методах хеширования.

У меня есть способ проверить пользователей по их электронной почте, мне просто нужен способ брать пароли, которые они мне дают, и сохранять их в базе данных способом, приемлемым для Django. Это нужно будет сделать на Perl, так как это единственный язык, который я знаю на сервере.

Я нашел эту страницу, где говорилось о том, как Django обрабатывает пароли, но я, к сожалению, не понимаю большей части того, что они говорят. Кроме того, я не знаю, поможет ли это, но административная область сайта Django дает «подсказку»

«Используйте ‘[algo]$[salt]$[hexdigest]» в качестве пароля.

Для меня это тоже ничего не значит, но, может, для кого-то из вас имеет значение?


person Dan Goodspeed    schedule 27.02.2014    source источник
comment
У вас есть соль, с которой был создан хэш паролей?   -  person Drewness    schedule 27.02.2014
comment
У меня есть доступ ко всем скриптам Python, которые поддерживают Django, поэтому, если кто-то может сказать мне, какой файл мне нужно посмотреть, я могу его получить.   -  person Dan Goodspeed    schedule 27.02.2014
comment
каков алгоритм для существующих пользователей Django? (часть перед первым $)   -  person ysth    schedule 27.02.2014
comment
похоже, у вас есть существующие пароли базы данных пользователей MySQL в открытом виде, а не в хэше? Вы можете это подтвердить?   -  person ysth    schedule 27.02.2014
comment
@ysth, я считаю, что это тот алгоритм, который я ссылка в сообщении. А в MySQL пароли пользователей хэшируются по-разному, поэтому я просто не могу их скопировать. Пользователям придется выбирать новые пароли с помощью perl-скрипта, который я пишу, но я просто не знаю, как взять пароли, которые они мне дают, и зашифровать их для базы данных.   -  person Dan Goodspeed    schedule 27.02.2014
comment
Я почти уверен, что алгоритм можно настроить, поэтому я предложил посмотреть, что есть у существующих пользователей Django.   -  person ysth    schedule 27.02.2014
comment
Хорошо… это поможет… вот зашифрованный пароль моей учетной записи на сайте — sha1$a35f0$9bd1c45156c545041c91222bb4658e88d6cbfb63   -  person Dan Goodspeed    schedule 27.02.2014
comment
Что ж, это помогает, по крайней мере, в том, что теперь мы знаем, что пароли состоят из трех частей и используют sha1. Так что либо делайте то, что предлагается в данном ответе, либо перепишите часть соли для perl. Это та часть, с которой вам нужна помощь?   -  person Neil Lunn    schedule 27.02.2014
comment
Да… переписывание соли для Perl. Я сделал только хеширование, которое я сделал, это PHP crypt, который просто принимает функцию, пароль струна и соляная струна. Это выглядит более сложным, чем это.   -  person Dan Goodspeed    schedule 27.02.2014


Ответы (1)


В основном есть два способа справиться с этим: преобразовать существующие пароли в формат, приемлемый для Django, или написать свой собственный хэш-код паролей Django.

В первом случае, как вы обнаружили, поле пароля состоит из трех частей, каждая из которых разделена знаком $. (Пароли Django 1.6 могут состоять из 4 частей, но давайте пока проигнорируем эту дополнительную часть, так как Django 1.6 также поддерживает более традиционные пароли из 3 частей.)

  • алгоритм, описывающий алгоритм хеширования пароля; он будет выглядеть как md5, pbkdf2 и т. д.
  • соль, соль для алгоритма хеширования.
  • hexdigest, хешированный пароль

Таким образом, предполагая, что ваши пароли уже засолены и хешированы, ваш сценарий должен взять хешированные/засоленные пароли в вашей существующей базе данных, отделить соль от хэша, а затем сохранить их в базе данных с префиксом соответствующей строки алгоритма. Должны быть Perl-модули для хеширования паролей с использованием различных алгоритмов. Рекомендуемый алгоритм Django — PBKDF2. bcrypt тоже хорошо. Однако для Django подойдет любой алгоритм хэширования, если у него есть встроенный хэшер для этого алгоритма (у Django есть хэшеры для наиболее распространенных алгоритмов хеширования).

Если ваши существующие пароли не засолены и не хешированы… сейчас самое время это сделать. ;-)


Альтернативный способ — просто скопировать пароли в новую базу данных как есть и написать свой собственный хэш паролей для их обработки в вашем приложении Django. Конечно, для этого потребуется написать некоторый код на Python.

person mipadi    schedule 27.02.2014
comment
Итак, если используется алгоритм sha1, достаточно ли этого, чтобы написать Perl-скрипт, который берет незашифрованный пароль и преобразует его во что-то, что будет использовать Django? Мы все еще используем Django 0.8, потому что компания (правильно) боится, что обновление что-то сломает, и у нас нет никого, кто знает Django. - person Dan Goodspeed; 27.02.2014
comment
написание нового хэшера паролей не звучало как вариант, поскольку похоже, что у них есть существующие пользователи Django, а также те, которых они добавляют. - person ysth; 27.02.2014
comment
Как сказал @ysth, в базе данных уже есть пользователи, с которыми я объединяю новых. Мы приняли тот факт, что пользователям MySQL придется выбирать новые/повторно вводить пароли при следующем входе в систему. Все, что я пытаюсь сделать, это отправить им по электронной почте уникальные ссылки (для подтверждения каждого пользователя), а затем по этой ссылке, попросите их выбрать новый пароль и добавить его в базу данных в формате, который Django распознает, когда они попытаются войти в систему таким образом. Я не уверен, как работает соль… просматривая список солей уже в базе данных, это всегда 5 шестнадцатеричных символов, некоторые из них одинаковы, большинство уникальны. - person Dan Goodspeed; 27.02.2014
comment
соль — это случайное число, идеально выбираемое для каждого нового пароля, которое добавляется к данным, чтобы один и тот же пароль не всегда хэшировался одинаково (что упрощает создание таблиц поиска для общих паролей). - person ysth; 27.02.2014
comment
Кто-то на другом форуме только что предложил использовать встроенный сброс пароля. Это немного хлопотно, но это намного меньше кода, и это сработает. Поэтому я думаю, что именно так я и пойду. И спасибо за объяснение соли. В других моих проектах я просто использую имя пользователя для соли, так как это делает каждый проект уникальным… и нет необходимости хранить соль в поле пароля. - person Dan Goodspeed; 27.02.2014
comment
@ysth: проект Django может иметь несколько хэшеров паролей. - person mipadi; 27.02.2014