将 bcrypt 密码哈希从 PHP 迁移到 Python - ValueError:无效的 hashed_pa​​ssword salt

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)

Mar*_*ers 6

2y2abcrypt 算法的两个不同版本。正如维基百科所述,仅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项目。虽然它只支持2a2b生成哈希值,但它明确支持规范化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)