0

我正在使用 Python 3.9.7 和 Django 3.2.7。

问题详情

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

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

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

为什么它总是返回 False?

散列密码:pbkdf2_sha256$260000$Y0LeK0HJ90YPrj5lOijV20$oFRLMk
普通密码:123

到目前为止我搜索的内容

Django check_password() 总是返回 False 但这并不能解决我的问题。

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

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)
4

2 回答 2

2

哈希密码:pbkdf2_sha256$260000$Y0LeK0HJ90YPrj5lOijV20$oFRLMk

max_length=50太短,导致哈希被截断。

将其更改为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)
于 2021-09-27T16:19:59.913 回答
-1

为什么不直接使用 User check_password

例子:

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

这里的用户是你的用户实例

编辑1:

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

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

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

于 2021-09-23T14:55:16.713 回答