py-bcrypt与flask-bcrypt哈希结果不同,可能吗?
我在一个使用flask-bcrypt包的Python应用中生成了一个哈希值,这个包是基于flask-security的。对于密码“test12”,我得到了一个结果:'$2a$12$ibinoz7sTc76Vh09shUhruYD8CrJyUxPpu1m.kb6LmFmzvWBbb52a'
(根据bcrypt的文档,我使用了随机生成的盐值)
但是当我在Python终端中执行以下代码时:
import py-bcrypt
print bcrypt.hashpw("test12", '$2a$12$ibinoz7sTc76Vh09shUhruYD8CrJyUxPpu1m.kb6LmFmzvWBbb52a')
我得到的结果是:$2a$12$ibinoz7sTc76Vh09shUhru1wllZi3KqQEluhhInj5FAghM4uczmxe
我本以为应该能得到原始密码的匹配结果。然后我用.checkpw检查了一下,结果是False。
我到底哪里出错了?它们可能会产生不同的结果吗?我的应用程序的认证功能正常。
更新:当我在Flask应用中手动调用
print check_password_hash('$2a$12$ibinoz7sTc76Vh09shUhruYD8CrJyUxPpu1m.kb6LmFmzvWBbb52a', 'test12')
时,我也得到了False。这真的很奇怪,因为'test12'可以正常登录。如果我在应用中生成一个新的密码哈希,并用上面的方式检查,它是通过的。
更新2:我了解到flask-security使用HMAC,以及选择的密码哈希后端(在我的情况下是bcrypt),我怀疑这可能是导致不一致的原因。如果这是真的,那么问题就变成了,如何验证一个同时应用了HMAC和bcrypt的密码哈希。我的应用配置了一个秘密密钥作为HMAC盐(sha512),所以我尝试了:
result = hmac.new('...my apps secretkey...', 'test12', hashlib.sha512).hexdigest()
print bcrypt.checkpw(result, '$2a$12$ibinoz7sTc76Vh09shUhruYD8CrJyUxPpu1m.kb6LmFmzvWBbb52a')
但这也没有成功。
1 个回答
1
如果你想生成相同的哈希值,你需要相同的密码和相同的盐值。