用flaskbcryp生成和验证密码哈希

2024-10-01 15:48:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我正在开发一个非常小的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'

在这一点上一切都很好,但当我转过身来做这件事时:

^{pr2}$

我得到了一个完全不同的hash,尽管我开始时使用的是相同的纯文本_pw和salt。我以为那不该发生?此外,每次后续调用bc.generate_password_哈希()每次都会给我不同的结果:

>>> 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'

据我所知,明文密码和salt在两次呼叫之间没有变化。我好像找不到错误,有人能给我解释一下这里到底发生了什么,我做错了什么?在


Tags: fromimport密码passwordhashurandomgeneratesalt
1条回答
网友
1楼 · 发布于 2024-10-01 15:48:33

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

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

我没有在我的帖子中讨论这个问题,但是这里值得一提的是——我假设在登录时,您需要调用generate_password_hash()并从登录表单中提供密码,以创建第二个哈希,以便与check_password_hash()进行比较,但这不是必需的。check_password_hash()可以使用存储的哈希和表单密码(分别)调用,它将自动处理表单密码的salt和hash,并将其与存储的哈希进行比较。在

现在一切都很好。希望这对其他人有帮助!在

相关问题 更多 >

    热门问题