我将密码哈希存储在使用以下方法生成的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)
我的问题基本上是:
答案 0 :(得分:2)
从答案到: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