bar*_*ell 5 php python passwords hash bcrypt
我有一个 PHP7 应用程序,它可以像这样对用户密码进行哈希处理
$hash = password_hash($password, PASSWORD_BCRYPT);
Run Code Online (Sandbox Code Playgroud)
例如,如果我转到test1234那个,我有:
$2y$10$aazE9OUKZlOQiM6axwxU/utpOURLQ58pluqtFZkkGE3R9ShtUxBOm
Run Code Online (Sandbox Code Playgroud)
现在,我有一个 Python 应用程序,它也必须更新用户密码。它使用这样的东西:
import bcrypt
hash = bcrypt.hashpw(password, bcrypt.gensalt())
Run Code Online (Sandbox Code Playgroud)
例如,相同的密码test1234散列为:
$2a$12$vsI9Vf9gWj/Au3McYradxuozyZychmlfqoCJcSacDWuMzUDVpv33m
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,PHP 生成的$2y位置与 Python 的生成位置$2a相同,因此它们是哈希版本的一些不同版本。
现在,如果我尝试在 PHP 中验证 Python 和 PHP 哈希值,如下所示:
$result = password_verify($password, $hash);
Run Code Online (Sandbox Code Playgroud)
true两种情况我都有。但是,如果我尝试在 Python 端验证两者:
bcrypt.checkpw(password, hash)
Run Code Online (Sandbox Code Playgroud)
它仅适用于当我传递在 Python 中生成的哈希值时。如果我传递 PHP 中生成的哈希值,我会得到:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: Invalid hashed_password salt
Run Code Online (Sandbox Code Playgroud)
我的问题:我有什么遗漏的吗?
该模块由我使用 pip 安装的项目版本 0.4bcrypt提供:py-bcrypt
pip3 install py-bcrypt
Run Code Online (Sandbox Code Playgroud)
2y和2a是bcrypt 算法的两个不同版本。正如维基百科所述,仅2y特定于 PHP:
crypt_blowfish2011 年 6 月, BCrypt 的 PHP 实现中发现了一个错误。[...]$2y$他们还提出了让 crypt_blowfish 发出由固定算法生成的哈希值 的想法。没有其他人,包括规范的 OpenBSD,采用 2x/2y 的想法。此版本标记更改仅限于
crypt_blowfish.
该py-bcrypt模块在这里落后于时代,因为它只支持版本2a!截至 2014 年 2 月,版本 2b 是当前版本(修复了对长度超过 255 个字符的密码进行哈希处理的错误)。当前的 0.4 版本是在 2013 年发布的,所以我认为该项目此时已经死亡。
相反,您应该安装该bcrypt项目。虽然它只支持2a并2b生成哈希值,但它明确支持规范化2y哈希值以将它们视为2bhashes2y ,因此我使用该项目验证哈希值没有问题:
>>> import bcrypt
>>> bcrypt.__version__
'3.1.4'
>>> hash = b'$2y$10$aazE9OUKZlOQiM6axwxU/utpOURLQ58pluqtFZkkGE3R9ShtUxBOm'
>>> bcrypt.checkpw(b'test1234', b'$2y$10$aazE9OUKZlOQiM6axwxU/utpOURLQ58pluqtFZkkGE3R9ShtUxBOm')
True
Run Code Online (Sandbox Code Playgroud)