【问题标题】:Use pgcrypto to verify passwords generated by password_hash使用 pgcrypto 验证 password_hash 生成的密码
【发布时间】:2019-04-07 09:32:41
【问题描述】:

我在 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)

我的问题基本上是:

  • 我做错了吗?
  • 如果这不可能:是否有迁移路径可以使这成为可能?

【问题讨论】:

  • $2y$ 是 PHP 特定的算法,因为它的 $2a$ 实现有一个错误,IIRC。问题可能是很少有其他系统支持它。

标签: php postgresql crypt pgcrypto


【解决方案1】:

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

2a、2x、2y、2b没有区别。如果你写了你的 正确执行,它们都输出相同的结果。

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

使用示例中的值:

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

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

【讨论】:

  • 哇...感谢分享/调查这个!
猜你喜欢
  • 1970-01-01
  • 2015-06-03
  • 2014-12-03
  • 2022-01-09
  • 1970-01-01
相关资源
最近更新 更多