gpt4 book ai didi

php - 使用pgcrypto验证password_hash生成的密码

转载 作者:行者123 更新时间:2023-11-29 12:39:57 24 4
gpt4 key购买 nike

我将密码哈希值存储在使用以下命令生成的 Postgresql 数据库中:

password_hash($password, PASSWORD_DEFAULT);

现在我还希望能够使用 Postgresql 和 pgcrypto 验证用户密码。

但是 pgcrypto 的 crypt() 函数无法验证现有的密码哈希值。

但是 - 我可以使用 PHP 的 password_verify 验证 Postgresql 生成的密码哈希值。

例如:

password_hash('hello', PASSWORD_DEFAULT);
$2y$10$fD2cw7T6s4dPvk1SFHmiJeRRaegalE/Oa3zSD6.x5WncQJC9wtCAS
postgres=# SELECT crypt('hello', gen_salt('bf'));
crypt
--------------------------------------------------------------
$2a$06$7/AGAXFSTCMu9r.08oD.UulYR0/05q7lmuCTC68Adyu/aNJkzpoIW

验证:

// php_verify with the Postgresql hash
php > var_dump(password_verify('hello', '$2a$06$7/AGAXFSTCMu9r.08oD.UulYR0/05q7lmuCTC68Adyu/aNJkzpoIW'));
bool(true)

postgres=# SELECT crypt('hello', '$2y$10$fD2cw7T6s4dPvk1SFHmiJeRRaegalE/Oa3zSD6.x5WncQJC9wtCAS');
crypt
---------------
$2JgKNLEdsV2E
(1 Zeile)

我的问题基本上是:

  • 我做错了吗?
  • 如果这不可能:是否有迁移路径可以实现这一点?

最佳答案

来自答案:Where 2x prefix are used in BCrypt?其中包含有关由实现错误产生的 $2$ 变体的所有血淋淋的细节:

There is no difference between 2a, 2x, 2y, and 2b. If you wrote your implementation correctly, they all output the same result.

基于此,可以采用 PHP 的 password_hash 生成的哈希值,将前面的 $2y$ 替换为 $2a$ 并通过它作为 pgcrypto 的 crypt() 的第二个参数。

使用示例中的值:

postgres=# \set hash '$2a$10$fD2cw7T6s4dPvk1SFHmiJeRRaegalE/Oa3zSD6.x5WncQJC9wtCAS'

postgres=# SELECT crypt('hello', :'hash') = :'hash'
?column?
----------
t

关于php - 使用pgcrypto验证password_hash生成的密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55557494/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com