Enr*_* Jr 3 python hash bcrypt flask
所以我最近学会了如何在数据库中存储密码,即通过在明文密码中添加一个盐,对其进行哈希处理,然后存储哈希值.
我正在研究一个非常小的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'
Run Code Online (Sandbox Code Playgroud)
一切都在这一点上运作良好,但当我转身并做到这一点:
>>> bc.generate_password_hash(plaintext_pw + salt)
'$2a$12$qbywkEjuJgmBvXW6peHzAe.rWjoc.ybFKRNzuZhom2yJSXaMRcVTq'
Run Code Online (Sandbox Code Playgroud)
我得到一个完全不同的哈希,即使我开始使用相同的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'
Run Code Online (Sandbox Code Playgroud)
据我所知,plaintext_pw和salt在调用之间没有变化.我似乎无法在这里发现错误,有人可以向我解释这里发生了什么,以及我做错了什么?
好吧看起来我已经解决了我的问题.结果我没有正确使用bcrypt.这是我学到的东西:
每次调用generate_password_hash时哈希都不同,因为bcrypt会自动为您生成一个盐并将其附加到哈希密码,因此无需使用urandom生成它或单独存储它.
我在帖子中没有谈到这一点,但无论如何它值得注意 - 我假设在登录时你需要调用generate_password_hash()并从登录表单提供密码来为check_password_hash()创建第二个哈希来进行比较反对,但这不是必要的.check_password_hash()可以使用存储的哈希和表单密码(分别)进行调用,它将自动处理salting和哈希表单密码,并将其与存储的哈希进行比较.
而且现在一切都很好.希望这有助于其他人!
| 归档时间: |
|
| 查看次数: |
3655 次 |
| 最近记录: |