2016-09-03 1 views
0

Я использую Django 1.97. Зашифрованные пароли существенно отличаются (с точки зрения формата).Почему разница в формате зашифрованных паролей в Django

Некоторые пароли формата $$$:

pbkdf2_sha256$24000$61Rm3LxOPsCA$5kV2bzD32bpXoF6OO5YuyOlr5UHKUPlpNKwcNVn4Bt0= 

В то время как другие имеют формат:

!9rPYViI1oqrSMfkDCZSDeJxme4juD2niKcyvKdpB 

Пароли устанавливаются либо с помощью User.objects.create_user() или user.set_password(). Является ли эта разница ожидаемой?

ответ

1

Все будет в порядке. У вас просто есть пустые пароли в вашей базе данных.

Возвращаясь до V0.95, django использовал разделители $ для алгоритма разграничения/соль/хеш. В эти дни, django pulls out the algorithm first, посмотрев то, что находится перед первым $, а затем передает всю жребину для декодирования. Это позволяет использовать более широкий набор форматов, в том числе для PBKDF2, который добавляет дополнительный параметр итераций в этот список (в соответствии с вашим первым примером).

Однако он также признает, что некоторым пользователям не разрешается войти в систему и/или не иметь пароль. Это кодируется с использованием второго формата, который вы видели. Как вы можете видеть here:

Если пароль не None, то конкатенация UNUSABLE_PASSWORD_PREFIX и случайная строка будет возвращена, который запрещает логины.

Вы также можете увидеть, что случайная строка составляет ровно 40 символов - точно так же, как ваш второй пример.

Таким образом, это все, как ожидалось.

0

Не существует существенной разницы между User.objects.create_user() и user.set_password(), поскольку первый использует второй.

В принципе, пароли находятся в строке с форматом <algorithm>$<iterations>$<salt>$<hash> согласно docs. Различия могут исходить от переменной PASSWORD_HASHERS. Может быть, один пароль был создан с одним хашером и другим паролем с другим. Но если вы сохраните тех хашеров в переменной, упомянутой выше, все должно быть хорошо, пользователи смогут ее изменить и т. Д. Вы можете прочитать об этом в небольшом уведомлении после раздела bcrypt.

Также документы для django.contrib.auth упаковка может быть полезна. Link.

UPDATE:

Если вы найдете документацию старой версии Джанго (1.3, например), вы увидите, что

Предыдущие версии Django, такие как 0.90, используются простые MD5 хэшей без пароля соли. Для обратной совместимости все еще поддерживаются; они автоматически преобразуются в новый стиль при первом правиле check_password() для данного пользователя.

Так что я думаю, что ответ может быть где-то здесь. Но это действительно зависит от того, насколько унаследован ваш проект, поэтому вы можете решить, нормально ли это или что. В любом случае, вы можете указать check_password(). Или вы можете просто отправить по электронной почте своего пользователя с уведомлением «сменить пароль». На самом деле есть много факторов.

+0

Но пароль swcond, похоже, не в формате ' $ $ $ '. Это прекрасно? –

+0

Проверить обновление ответа – valignatev

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