我正在使用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())
我得到一个错误:盐无效
答案 0 :(得分:0)
盐无效的原因是散列密码周围多了b'...'
。这是因为hashpw
的结果是一个字节字符串,并且Django将自动对传递给非字符串的charfield的任何内容调用str
。您需要先对其进行解码。
但是在任何情况下您都不能这样做。尽管bcrypt是一个非常好的哈希库,但是没有理由让您复制Django提供的功能;这样,您几乎肯定会引入新的安全漏洞。不要这样从django.contrib.admin中的AbstractUser或AbstractBaseUser模型继承您的MasjeedUser,并使用它们的set_password
和check_password
方法。