check_password 未成功验证数据库存储的密码

check_password not verifying database stored password successfully

我正在使用 Python 3.9.7 和 Django 3.2.7。

问题详情

以下代码用于验证提交的密码。

我可以确认提交的密码具有有效值,user.password 是存储在数据库中的散列密码。

passwordCheckResult = check_password(request.POST.get("password"), user.password)
print(passwordCheckResult)

为什么总是return错误?

哈希密码:pbkdf2_sha2560000$Y0LeK0HJ90YPrj5lOijV20$oFRLMk
普通密码:123

到目前为止我搜索了什么

但这并不能解决我的问题。

下面的代码有效,但上面的代码无效。

hashed = make_password("123")
check_password("123", hashed)  # This returns True

型号

class tblusers(models.Model):
    user_id = BigAutoField(primary_key=True)
    password = CharField(max_length=50, null=False)
    created_at = DateTimeField(auto_now_add=True, blank=True)

为什么不直接使用用户check_password ?

示例:

user.check_password(request.POST.get("password"))

此处 user 是您的 User 实例

编辑 1:

我会假设 request.POST.get("password") 返回一个真实值,尝试像这样剥离值:

check_password(request.POST.get("password").strip(), user.password.password)

如果 request.POST.get("password") 正在返回 None,因此请仔细检查输入是否具有正确的属性 name ="密码"

Hashed password: pbkdf2_sha2560000$Y0LeK0HJ90YPrj5lOijV20$oFRLMk

max_length=50太短,导致hash被截断

改成128,就像Django的AbstractBaseUser.password

class tblusers(models.Model):
    user_id = BigAutoField(primary_key=True)
    # password = CharField(max_length=50, null=False)  # Change this
    password = CharField(max_length=128, null=False)   # to this
    created_at = DateTimeField(auto_now_add=True, blank=True)