使用flask-bcrypt生成和验证密码哈希值

时间:2014-04-12 04:11:03

标签: python hash flask bcrypt

所以我最近学会了如何在数据库中存储密码,即在明文密码中添加一个盐,对其进行哈希处理,然后存储哈希值。

我正在开发一个非常小的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在调用之间没有变化。我似乎无法在这里发现错误,有人可以向我解释这里发生了什么,以及我做错了什么?

1 个答案:

答案 0 :(得分:9)

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

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

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

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