【发布时间】:2014-05-26 09:37:08
【问题描述】:
所以我最近学习了如何在数据库中存储密码,即在明文密码中添加盐,对其进行散列,然后存储散列。
我正在开发一个非常小的 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 在调用之间没有变化。我似乎无法在这里发现错误,有人可以向我准确解释这里发生了什么,以及我做错了什么吗?
【问题讨论】: