python-3.x Django check_password()总是返回False

ldioqlga  于 2023-04-13  发布在  Python
关注(0)|答案(3)|浏览(196)

我有一个与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.1Python 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>
ni65a41a

ni65a41a1#

Django不存储原始哈希,它们以算法为前缀(参见文档)。
如果没有前缀,Django将无法识别正确的hasher。如果你查看check_password的源代码,你会看到如果它无法识别密码hasher,它将返回False
最干净的解决方案可能是直接使用bcrypt.checkpw的自定义身份验证后端。

bvhaajcl

bvhaajcl2#

我修复了这个问题:

from django.contrib.auth.hashers import make_password
password = make_password('yourpassword')

检查密码

has_usable_password
现在返回正确的值

biswetbf

biswetbf3#

这个问题可以通过使用“pip install bcrypt”命令安装bcrypt包来解决

相关问题