繁体   English   中英

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

[英]Generating and verifying password hashes with 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在调用之间没有变化。 我似乎无法在这里发现错误,有人可以向我解释这里发生了什么,以及我做错了什么?

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

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

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

而且现在一切都很好。 希望这有助于其他人!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM