使用bcrypt.checkpw时无效的Salt

时间:2019-05-12 06:40:52

标签: django django-models django-views

我正在使用Django开发用户身份验证应用程序。该应用程序允许用户创建一个帐户,然后登录。但是,在登录端,使用bcrypt.checkpw

检查用户密码时出现错误。

我尝试打印用户密码的值以及保存在数据库中的密码。我正在将SQLite用于数据库

print(request.POST['login_password'].encode())
print(user.password)

这是输出:

b'87654321'
b'$2b$12$bQ6tEDKh.tOJnnPAj84Xe.BZnGi9kI.Sc6Q4gFPeTLw9x53VSVQOW'

我也尝试过:

print(request.POST['login_password'].encode())
print(user.password.encode())

b'87654321'
b"b'$2b$12$bQ6tEDKh.tOJnnPAj84Xe.BZnGi9kI.Sc6Q4gFPeTLw9x53VSVQOW'"

要创建用户:

user = MasjeedUser.objects.create(first_name=request.POST['first_name'],last_name=request.POST['last_name'],password=bcrypt.hashpw(request.POST['password'].encode(), bcrypt.gensalt()),email=request.POST['email'])

查询密码:

当我使用

if bcrypt.checkpw(request.POST['login_password'].encode(),user.password)

我得到一个错误:检查之前必须对Unicode对象进行编码

当我尝试

if bcrypt.checkpw(request.POST['login_password'].encode(),user.password.encode())

我得到一个错误:盐无效

1 个答案:

答案 0 :(得分:0)

盐无效的原因是散列密码周围多了b'...'。这是因为hashpw的结果是一个字节字符串,并且Django将自动对传递给非字符串的charfield的任何内容调用str。您需要先对其进行解码。

但是在任何情况下您都不能这样做。尽管bcrypt是一个非常好的哈希库,但是没有理由让您复制Django提供的功能;这样,您几乎肯定会引入新的安全漏洞。不要这样从django.contrib.admin中的AbstractUser或AbstractBaseUser模型继承您的MasjeedUser,并使用它们的set_passwordcheck_password方法。