Php 使用pgcrypto验证密码\u哈希生成的密码

Php 使用pgcrypto验证密码\u哈希生成的密码,php,postgresql,crypt,pgcrypto,Php,Postgresql,Crypt,Pgcrypto,我将密码哈希存储在Postgresql数据库中,该数据库由以下内容生成: password\u散列($password,password\u默认值) 现在,我还希望能够使用Postgresql和pgcrypto验证用户密码 但是pgcrypto的crypt()函数无法验证现有密码哈希 但是-我可以用PHP的密码\u验证验证Postgresql生成的密码哈希 例如: password_hash('hello', PASSWORD_DEFAULT); $2y$10$fD2cw7T6s4dPvk1SF

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

password\u散列($password,password\u默认值)

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

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

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

例如:

password_hash('hello', PASSWORD_DEFAULT);
$2y$10$fD2cw7T6s4dPvk1SFHmiJeRRaegalE/Oa3zSD6.x5WncQJC9wtCAS
postgres=# \set hash '$2a$10$fD2cw7T6s4dPvk1SFHmiJeRRaegalE/Oa3zSD6.x5WncQJC9wtCAS'

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

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

我的问题基本上是:

  • 我做错了吗
  • 如果这是不可能的:是否有迁移路径使之成为可能
从答案到:其中包含了所有关于因实施缺陷而产生的$2$变体的血淋淋的详细信息:

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

基于此,可以使用PHP的
密码\u散列
生成的散列,将前导的
$2y$
替换为
$2a$
,并将其作为pgcrypto的
crypt()
的第二个参数传递

使用示例中的值:

password_hash('hello', PASSWORD_DEFAULT);
$2y$10$fD2cw7T6s4dPvk1SFHmiJeRRaegalE/Oa3zSD6.x5WncQJC9wtCAS
postgres=# \set hash '$2a$10$fD2cw7T6s4dPvk1SFHmiJeRRaegalE/Oa3zSD6.x5WncQJC9wtCAS'

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

$2y$
是一种特定于PHP的算法,因为它的
$2a$
实现有一个错误IIRC。问题可能是很少有其他系统支持它。哇。。。感谢分享/调查此信息!