【问题标题】:Migrate bcrypt password hash from PHP to Python - ValueError: Invalid hashed_password salt将 bcrypt 密码哈希从 PHP 迁移到 Python - ValueError: Invalid hashed_pa​​ssword salt
【发布时间】:2019-03-23 02:26:52
【问题描述】:

我有一个 PHP7 应用程序,可以像这样对用户密码进行哈希处理

$hash = password_hash($password, PASSWORD_BCRYPT);

例如,如果我将test1234 传递给那个,我有:

$2y$10$aazE9OUKZlOQiM6axwxU/utpOURLQ58pluqtFZkkGE3R9ShtUxBOm

现在,我有一个 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

【问题讨论】:

    标签: php python hash passwords bcrypt


    【解决方案1】:

    2y2atwo different versions of the bcrypt algorithm。正如维基百科所述,2y 仅适用于 PHP

    2011 年 6 月,在 BCrypt 的 PHP 实现 crypt_blowfish 中发现了一个错误。 [...] 他们还提出了让 crypt_blowfish 为固定算法生成的哈希值发出 $2y$ 的想法。

    没有其他人,包括规范的 OpenBSD,采用 2x/2y 的想法。此版本标记更改仅限于 crypt_blowfish

    py-bcrypt 模块在这里落后了,因为它只支持2a 版本!截至 2014 年 2 月,版本 2b 是当前版本(修复了哈希密码长度超过 255 个字符的错误)。当前的 0.4 版本是在 2013 年发布的,所以我认为这个项目现在已经死了。

    相反,您应该安装bcrypt project。虽然它只支持2a2b生成 哈希,但它明确地supports normalising 2y hashes to treat them as 2b hashes,所以我使用该项目验证2y 哈希没有问题:

    >>> import bcrypt
    >>> bcrypt.__version__
    '3.1.4'
    >>> hash = b'$2y$10$aazE9OUKZlOQiM6axwxU/utpOURLQ58pluqtFZkkGE3R9ShtUxBOm'
    >>> bcrypt.checkpw(b'test1234', b'$2y$10$aazE9OUKZlOQiM6axwxU/utpOURLQ58pluqtFZkkGE3R9ShtUxBOm')
    True
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      • 2017-01-26
      • 2015-09-02
      • 2014-11-24
      • 2012-06-02
      相关资源
      最近更新 更多