如何使用Bcrypt加密Django中的密码

时间:2015-11-25 02:43:54

标签: python django encryption bcrypt

我正在尝试使用Bcrypt加密用户在注册时提供的密码,然后使用Bcrypt验证用户在登录时存储在数据库中的散列版本时提供的密码。

有一些关于如何通过Django docs安装Bcrypt的很好的文档,但它们实际上并没有向您展示如何使用Bcrypt来哈希密码或使用其他命令。

你需要从某个地方导入Brcrypt吗?如果是这样,它的正确语法是什么?散列密码和将散列密码与非散列密码进行比较的语法是什么?

我在settings.py文件中安装了Bcrypted库,并通过pip安装了Bcrypt。使用Bcrypt还需要做什么?

2 个答案:

答案 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?

中提到的字符串进行操作