Как использовать 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 без модели пользователя?