我正在尝试使用Bcrypt加密用户在注册时提供的密码,然后使用Bcrypt验证用户在登录时存储在数据库中的散列版本时提供的密码。
有一些关于如何通过Django docs安装Bcrypt的很好的文档,但它们实际上并没有向您展示如何使用Bcrypt来哈希密码或使用其他命令。
你需要从某个地方导入Brcrypt吗?如果是这样,它的正确语法是什么?散列密码和将散列密码与非散列密码进行比较的语法是什么?
我在settings.py文件中安装了Bcrypted库,并通过pip安装了Bcrypt。使用Bcrypt还需要做什么?
答案 0 :(得分:8)
点击链接:
用户对象的密码属性是此格式的字符串:
<algorithm>$<iterations>$<salt>$<hash>
这些是使用的组件 用于存储用户密码,由美元符号字符分隔 并包括:哈希算法,算法数量 迭代(工作因子),随机盐和结果密码 哈希值。该算法是许多单向散列或密码之一 Django可以使用的存储算法;见下文。迭代描述了 算法在哈希上运行的次数。盐是随机的 使用的种子和哈希是单向函数的结果。
我在settings.py文件中安装了Bcrypted库... 使用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.contrib.auth.hashers模块提供了一组函数 创建并验证哈希密码。您可以单独使用它们 来自用户模型。
check_password(密码,已编码)
如果您想通过将纯文本密码与散列进行比较来手动验证用户身份 数据库中的密码,使用方便功能 check_password()。它需要两个参数:明文密码 检查,以及数据库中用户密码字段的完整值 检查,如果匹配则返回True,否则返回False。
https://docs.djangoproject.com/en/1.9/topics/auth/passwords/#module-django.contrib.auth.hashers
或者,您可以使用authenticate()
:
<强>认证(**凭证)强>
要验证给定的用户名和密码,请使用authenticate()。它需要凭证的形式 关键字参数,对于默认配置,这是用户名和 密码,如果密码有效,则返回User对象 给定的用户名。如果密码无效,则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')
这些是默认值:我的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_sha256$20000$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_sha256$20000$DS20ZOCWTBFN$AFfzg3iC24Pkj5UtEu3O+J8KOVBQvaLVx43D0Wsr4PY='
>>> user.set_password('666monkeysAndDogs777')
>>> user.password
'bcrypt_sha256$$2b$12$QeWvpi7hQ8cPQBF0LzD4C.89R81AV4PxK0kjVXG73fkLoQxYBundW'
您可以看到密码已更改为bcrypt版本。
答案 1 :(得分:1)
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()
最后,您还可以按照How to quickly encrypt a password string in Django without an User Model?
中提到的字符串进行操作