1

我将密码哈希存储在 Postgresql 数据库中,该数据库由以下内容生成:

password_hash($password, PASSWORD_DEFAULT);

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

但是 pgcrypto 的crypt()函数不能验证现有的密码哈希。

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

例如:

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)

我的问题基本上是:

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

1 回答 1

3

从答案到:BCrypt 中在哪里使用 2x 前缀?其中包含有关由实现错误产生的 $2$ 变体的所有血腥细节:

2a、2x、2y 和 2b 之间没有区别。如果你正确地编写了你的​​实现,它们都会输出相同的结果。

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

使用示例中的值:

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

postgres=# SELECT crypt('hello', :'hash') = :'hash'
 ?column? 
----------
 t
于 2019-04-07T17:04:49.603 回答