【问题标题】:Generating and verifying password hashes with flask-bcrypt使用 flask-bcrypt 生成和验证密码哈希
【发布时间】:2014-05-26 09:37:08
【问题描述】:

所以我最近学习了如何在数据库中存储密码,即在明文密码中添加盐,对其进行散列,然后存储散列。

我正在开发一个非常小的 Flask 应用程序来尝试所有这些,但我遇到了密码哈希和检查部分过程的问题。似乎我最终会为相同的输入得到两个不同的哈希值,我似乎无法弄清楚为什么。

我在解释器中做了一个小实验来测试一下。

>>> from os import urandom
>>> salt = urandom(32).encode('base-64')
>>> salt
'+3DejJpQZO9d8campsxOB6fam6lBE0mJ/+UvFf3oG8c=\n'
>>> plaintext_pw = 'archer'
>>> plaintext_pw
'archer'
>>> salted_pw = plaintext_pw + salt
>>> salted_pw
'archer+3DejJpQZO9d8campsxOB6fam6lBE0mJ/+UvFf3oG8c=\n'
>>> from flaskext.bcrypt import Bcrypt
>>> bc = Bcrypt(None)
>>> hashed_pw = bc.generate_password_hash(salted_pw)
>>> hashed_pw
'$2a$12$znMwqAw.GliVE8XFgMIiA.aEGU9iEZzZZWfxej5wSUFP0huyzdUfe'

此时一切正常,但是当我转身这样做时:

>>> bc.generate_password_hash(plaintext_pw + salt)
'$2a$12$qbywkEjuJgmBvXW6peHzAe.rWjoc.ybFKRNzuZhom2yJSXaMRcVTq'

我得到一个完全不同的哈希,即使我开始使用相同的 plaintext_pw 和 salt。我以为这不应该发生?此外,每次对 bc.generate_password_hash() 的后续调用每次都会给我不同的结果:

>>> bc.generate_password_hash(plaintext_pw + salt)
'$2a$12$FAh9r4oaD40mWPtkClAnIOisP37eAT5m.i.EGV1zRAsPNbxg3BlX2'
>>> bc.generate_password_hash(plaintext_pw + salt)
'$2a$12$gluk9RUiR6D0e2p1J.hNgeE3iTFxDUlCNvFJOsCZZk89ngO.Z6/B6'

据我所知,plaintext_pw 和 salt 在调用之间没有变化。我似乎无法在这里发现错误,有人可以向我准确解释这里发生了什么,以及我做错了什么吗?

【问题讨论】:

    标签: python hash flask bcrypt


    【解决方案1】:

    好的,看来我已经解决了我的问题。原来我没有正确使用 bcrypt。这是我学到的:

    每次我调用 generate_password_hash 时,哈希值都不同,因为 bcrypt 会自动为您生成一个 salt 并将其附加到哈希密码中,因此无需使用 urandom 生成它或单独存储它。

    我没有在我的帖子中谈论这个,但无论如何这里值得注意 - 我假设在登录时您需要调用 generate_password_hash() 并提供登录表单中的密码来为 check_password_hash( ) 进行比较,但这不是必需的。 check_password_hash() 可以使用存储的哈希和表单密码(分别)调用,它会自动处理表单密码的加盐和哈希,并将其与存储的哈希进行比较。

    现在一切正常。希望这对其他人有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-06
      • 2012-07-13
      • 1970-01-01
      • 2015-11-30
      • 1970-01-01
      相关资源
      最近更新 更多