Django check_password()总是返回False

时间:2019-04-08 10:19:53

标签: django python-3.x django-2.1

我有一个与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>

2 个答案:

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

立即返回正确的值