Как использовать Bcrypt для шифрования паролей в Django

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

есть довольно хорошая документация о том, как установить Bcrypt через Django docs, но они на самом деле не показывают вам, как использовать Bcrypt для хэш-паролей или использовать другие команды.

вам нужно импортировать Brcrypt откуда-то? Если да, то каков правильный синтаксис? Каков синтаксис хэширования паролей и сравнения хэшированных паролей с не хэшированными паролями?

Я установил библиотеку Bcrypted в settings.py файл, а также установлен Bcrypt через pip. Что еще мне нужно сделать, чтобы использовать Bcrypt?

2 ответов


по вашей ссылке:

на атрибут пароль of объект является строкой в этом формате:

<algorithm>$<iterations>$<salt>$<hash> это используемые компоненты для хранения пароля пользователя, разделенные символом знака доллара и состоят из: алгоритм хэширования, количество алгоритмов итерации (коэффициент работы), случайная соль и полученный пароль хэш. Алгоритм является одним из ряда одностороннее хеширование или пароль алгоритмы хранения Django можно использовать, см. ниже. Итерации описывают количество раз, когда алгоритм работает над хэшем. Соль-это случайность семя используется, и хэш является результатом односторонней функции.


Я установил библиотеку Bcrypted в settings.py файл... Что еще мне нужно сделать, чтобы использовать Bcrypt?

Я не уверен, что это первое предложение означает. Вам нужно поставить следующее в settings.py:

PASSWORD_HASHERS = (
    'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
    'django.contrib.auth.hashers.BCryptPasswordHasher',
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
    'django.contrib.auth.hashers.SHA1PasswordHasher',
    'django.contrib.auth.hashers.MD5PasswordHasher',
    'django.contrib.auth.hashers.CryptPasswordHasher',
)

используйте Bcrypt для проверки пароля, который пользователь предоставляет при входе в систему хэшированная версия, хранящаяся в базе данных.

вы можете сделать это вручную:

в Django.ВНО.автор.модуль hashers предоставляет набор функций для создание и проверка хэшированного пароля. Вы можете использовать их независимо из модели пользователя.

check_password(пароль, закодировано)
Если вы хотите вручную аутентифицировать пользователя, сравнивая простой текстовый пароль с хэшированным пароль в базе данных, используйте функции комфорта check_password(). Требуется два аргумента: простой текстовый пароль для проверка и полное значение поля пароля пользователя в базе данных для проверки и возвращает True, если они совпадают, False иначе.

https://docs.djangoproject.com/en/1.9/topics/auth/passwords/#module-django.contrib.auth.hashers

или, вы можете использовать authenticate():

аутентификация (**учетные данные)
Для аутентификации данного имени пользователя и пароля используйте authenticate (). Он принимает данные в виде ключевые аргументы для конфигурации по умолчанию это логин и пароль, и он возвращает пользователя объект, если пароль действителен для данное имя пользователя. Если пароль недействителен, authenticate () возвращает Никто. Пример:

from django.contrib.auth import authenticate

user = authenticate(username='john', password='password to check')

if user is not None:
    # the password verified for the user
    if user.is_active:
        print("User is valid, active and authenticated")
    else:
        print("The password is valid, but the account has been disabled!")
else:
    # the authentication system was unable to verify the username and password
    print("The username and password were incorrect.")

https://docs.djangoproject.com/en/1.9/topics/auth/default/#authenticating-users

вот несколько примеров:

(django186p34)~/django_projects/dj1$ python manage.py shell

Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 23 2015, 02:52:03) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)

>>> from django.conf import settings
>>> print(settings.PASSWORD_HASHERS)

('django.contrib.auth.hashers.PBKDF2PasswordHasher',
 'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
 'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
 'django.contrib.auth.hashers.BCryptPasswordHasher',
 'django.contrib.auth.hashers.SHA1PasswordHasher',
 'django.contrib.auth.hashers.MD5PasswordHasher',
 'django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher',
 'django.contrib.auth.hashers.UnsaltedMD5PasswordHasher', 
 'django.contrib.auth.hashers.CryptPasswordHasher')

это значения по умолчанию: в my нет записи settings.py для PASSWORD_HASHERS.

>>> from django.contrib.auth.models import User

>>> my_user = User.objects.create_user('ea87', 'ea@gmail.com', '666monkeysAndDogs777')

>>> my_user.save()
>>> my_user.password
'pbkdf2_sha256000$L7uq6goI1HIl$RYqywMgPywhhku/YqIxWKbpxODBeczfLm5zthHjNSSk='
>>> my_user.username
'ea87'

>>> from django.contrib.auth import authenticate

>>> authenticate(username='ea87', password='666monkeysAndDogs777')
<User: ea87>

>>> print(authenticate(username='ea87', password='wrong password'))
None

>>> from django.contrib.auth.hashers import check_password

>>> check_password('666monkeysAndDogs777', my_user.password)
True

>>> exit()

далее, я добавил следующие settings.py:

PASSWORD_HASHERS = (
    'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
    'django.contrib.auth.hashers.BCryptPasswordHasher',
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
    'django.contrib.auth.hashers.SHA1PasswordHasher',
    'django.contrib.auth.hashers.MD5PasswordHasher',
    'django.contrib.auth.hashers.CryptPasswordHasher',
)

(django186p34)~/django_projects/dj1$ python manage.py shell

Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 23 2015, 02:52:03) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)

>>> from django.conf import settings
>>> print(settings.PASSWORD_HASHERS)
('django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
 'django.contrib.auth.hashers.BCryptPasswordHasher',
 'django.contrib.auth.hashers.PBKDF2PasswordHasher',
 'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
 'django.contrib.auth.hashers.SHA1PasswordHasher',
 'django.contrib.auth.hashers.MD5PasswordHasher', 
 'django.contrib.auth.hashers.CryptPasswordHasher')

обратите внимание на хешеры bcrypt в передней части кортежа.

>>> from django.contrib.auth.models import User

>>> user = User.objects.get(username='ea87')
>>> user
<User: ea87>

>>> user.password
'pbkdf2_sha256000$DS20ZOCWTBFN$AFfzg3iC24Pkj5UtEu3O+J8KOVBQvaLVx43D0Wsr4PY='

>>> user.set_password('666monkeysAndDogs777')
>>> user.password
'bcrypt_sha256$b$QeWvpi7hQ8cPQBF0LzD4C.89R81AV4PxK0kjVXG73fkLoQxYBundW'

вы можете видеть, что пароль изменился на версию bcrypt.


краткая версия ответа 7stud

в проекте шаблона Django 1.9 по умолчанию используйте create_user:

User.objects.create_user(username='uname', password='mypass')

вместо create, который не хэширует пароль.

другой вариант-установить пароль:

user = User(username='uname')
user.set_password('mypass')
user.save()

наконец, вы также можете работать со строками, как указано в:как быстро зашифровать строку пароля в Django без модели пользователя?