【问题标题】:Flask bcrypt.check_password_hash() always returns False, can't narrow in on my mistake烧瓶 bcrypt.check_password_hash() 总是返回 False,不能缩小我的错误
【发布时间】:2018-06-22 23:41:04
【问题描述】:

在尝试在烧瓶中编写登录功能时,我想尝试“bcrypt”烧瓶扩展。当我使用_bcrypt.check_password_hash()_ 方法将用户表单输入密码与用户在数据库中保存的密码进行比较时,它总是返回false。

这是我用来生成密码的代码:

    hashPwd = bcrypt.generate_password_hash('form.password.data')

这是我用来检查候选密码和保存密码的代码:

if form.validate_on_submit():
    user = User.query.filter_by(username=form.username.data).first()

    if user and bcrypt.check_password_hash(user.password, form.password.data):
        login_user(user, remember=form.rememberMe.data)

如果我在 python shell 中执行User.query.get(1).password,密码格式为:

u'$2b$12$JOXUftWBbn/egABOkAYNwezGKfh6GzIHOofUnvx73AiSOfoNWEGFC'

当我在代码中运行相同的查询时,密码是:

$2b$12$JOXUftWBbn/egABOkAYNwezGKfh6GzIHOofUnvx73AiSOfoNWEGFC

第一个 pw 中的 u' 是唯一的区别,这可能是问题原因,但我不知道它是什么。

有什么想法吗?

【问题讨论】:

  • 您需要检查密码的哈希值,而不是用户输入的纯文本密码。

标签: python flask bcrypt


【解决方案1】:

来自http://flask-bcrypt.readthedocs.io/en/latest/

pw_hash = bcrypt.generate_password_hash('hunter2')
bcrypt.check_password_hash(pw_hash, 'hunter2') # returns True

在您的情况下,反向函数需要根据密码检查哈希 user.password 实际上应该是 hashPwd

if user and bcrypt.check_password_hash(hashPwd, form.password.data):

【讨论】:

  • 嗨德米特里。从我粘贴的代码中看不太清楚,但是 hashPwd 是我的“注册”类中的一个类方法,我不能在我的检查中使用它,这是一个登录类方法。
  • 你用的是python3吗?从相同的文档中,您可能必须对哈希执行 bcrypt.generate_password_hash('hunter2').decode('utf-8')
  • 我使用的是 python 2.7.1
  • hashPwd = bcrypt.generate_password_hash('form.password.data') 是应该将密码散列为 password = "form.password.data" 我想你可能会用它作为一个例子但也许你只是想说 hashPwd = bcrypt.generate_password_hash(form.password.data)
  • 就是这样。我什至没有注意到我将 form.password.data 作为字符串发送。谢谢
猜你喜欢
  • 2020-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 2021-06-24
  • 2020-06-27
  • 1970-01-01
相关资源
最近更新 更多