我有一个PHP7应用程序,可以像这样散列用户的密码
$hash = password_hash($password, PASSWORD_BCRYPT);
例如,如果我将test1234
传递给它,我得到:
现在,我有一个Python应用程序,它也需要更新用户的密码。它使用的是这样的:
import bcrypt
hash = bcrypt.hashpw(password, bcrypt.gensalt())
例如,相同的密码test1234
散列为:
$2a$12$vsI9Vf9gWj/Au3McYradxuozyZychmlfqoCJcSacDWuMzUDVpv33m
如您所见,PHP生成了$2y
,而Python生成了$2a
-因此它们是哈希的不同版本。在
现在,如果我尝试在PHP中验证Python和PHP散列,如下所示:
$result = password_verify($password, $hash);
两种情况下我都有true
。但是,如果我尝试在Python端验证这两种方法:
bcrypt.checkpw(password, hash)
它只适用于当我传递Python生成的散列时。如果我传递在PHP中生成的散列,我得到:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: Invalid hashed_password salt
我的问题是:我有什么遗漏吗?在
bcrypt
模块由我使用pip安装的py-bcrypt
项目0.4版提供:
pip3 install py-bcrypt
2y
和{2y
仅对PHP特定:py-bcrypt
模块落后于时代,因为它只支持2a
版本!截至2014年2月,2b版是当前版本(修正了一个超过255个字符的密码散列错误)。目前的0.4版本是在2013年发布的,所以我认为这个项目现在已经死了。在相反,您应该安装^{} project 。虽然它只支持} hashes to treat them as ^{} hashes ,因此我可以使用该项目验证
2a
和2b
来生成哈希,但它显式地supports normalising ^{2y
哈希:相关问题 更多 >
编程相关推荐