我有一个与NodeJs应用程序一起使用的现有数据库,现在该数据库将用于由Django构建的新应用程序。 我有一个user_account表,该表存储用户登录凭据,并且已使用密码bcrypt模块进行加密。密码存储在字段user_password
中我扩展了Django Users模型,并覆盖了其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>
答案 0 :(得分:2)
Django不存储原始哈希,它们以算法为前缀(请参见documentation)。
没有前缀,Django将无法识别正确的哈希器。如果您查看source of check_password
,将会发现如果无法识别密码哈希,它将返回False
。
最干净的解决方案可能是直接使用bcrypt.checkpw
的{{3}}。
答案 1 :(得分:0)
我通过以下方式解决了该问题:
from django.contrib.auth.hashers import make_password
password = make_password('yourpassword')
check_password
和
has_usable_password
立即返回正确的值