我有一个 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)