[英]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.