py-bcrypt与flask-bcrypt哈希结果不同,可能吗?

2 投票
1 回答
1213 浏览
提问于 2025-04-18 16:03

我在一个使用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

如果你想生成相同的哈希值,你需要相同的密码相同的盐值

撰写回答