我有一个与NodeJs应用程序一起使用的现有数据库,现在相同的数据库将用于使用Django构建的新应用程序。我有一个user_account表,用于存储用户登录凭据,并使用bcrypt模块进行密码加密。密码存储在字段user_password
我已经扩展了Django用户模型,并覆盖了它的authencticate
方法,该方法工作正常。对于密码验证,我使用了bcrypt方法bcrypt.checkpw(password, hashed)
,该方法也工作正常。
**问题:**我想使用django user.check_password(password)
而不是bcrypt.checkpw(password, hashed)
。因为它可以保存在密码匹配之前生成盐和编码的痛苦,而且最重要的是它是一个内置的方法。
import bcrypt
from django.contrib.auth.hashers import check_password
#password = plain text password entered by user at login
#hashedPassword = Password stored in db (fieldName: user_password)
check_password(password, hashedPassword) #It returns False
user.check_password(password) # It also returns False
#for same password
bcrypt.checkpw(password, hashedPassword) # returns True
#hashedPassword format $2b$12$NNVaNL2Zla0E/WwC6Mkjjer6Qh3zIBCN6kMl9qxLE/xxyt4NAgXMq
我使用的是Django 2.1和Python 3.6
我已经检查了相关的问题,但所有的问题都与表单有关,我没有使用任何Django表单。
我的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.Argon2PasswordHasher',
]
输入法是一个简单的Django模板
<div class='col-md-12'>
<form action='/auth/login' method='post'>
{% csrf_token %}
<div class='form-group row'>
<label for='email'>Email</label>
<input type='email' class='form-control' id='email' name='username'>
</div>
<div class='form-group row'>
<label for='password'>Password</label>
<input type='password' class='form-control' id='password' name='password'>
</div>
<div class='form-group row'>
<button class='btn btn-outline-secondary' type='submit'>Log in</button>
</div>
</form>
</div>
3条答案
按热度按时间ni65a41a1#
Django不存储原始哈希,它们以算法为前缀(参见文档)。
如果没有前缀,Django将无法识别正确的hasher。如果你查看
check_password
的源代码,你会看到如果它无法识别密码hasher,它将返回False
。最干净的解决方案可能是直接使用
bcrypt.checkpw
的自定义身份验证后端。bvhaajcl2#
我修复了这个问题:
检查密码
和
has_usable_password
现在返回正确的值
biswetbf3#
这个问题可以通过使用“pip install bcrypt”命令安装bcrypt包来解决