mad*_*low 2 php postgresql crypt pgcrypto
我将密码哈希值存储在使用以下命令生成的 Postgresql 数据库中:
password_hash($password, PASSWORD_DEFAULT);
现在我还希望能够使用 Postgresql 和 pgcrypto 验证用户密码。
但 pgcrypto 的crypt()功能无法验证现有的密码哈希值。
但是 - 我可以使用 PHP 验证 Postgresql 生成的密码哈希值password_verify。
例如:
password_hash('hello', PASSWORD_DEFAULT);
$2y$10$fD2cw7T6s4dPvk1SFHmiJeRRaegalE/Oa3zSD6.x5WncQJC9wtCAS
Run Code Online (Sandbox Code Playgroud)
postgres=# SELECT crypt('hello', gen_salt('bf'));
crypt
--------------------------------------------------------------
$2a$06$7/AGAXFSTCMu9r.08oD.UulYR0/05q7lmuCTC68Adyu/aNJkzpoIW
Run Code Online (Sandbox Code Playgroud)
确认:
// php_verify with the Postgresql hash
php > var_dump(password_verify('hello', '$2a$06$7/AGAXFSTCMu9r.08oD.UulYR0/05q7lmuCTC68Adyu/aNJkzpoIW'));
bool(true)
Run Code Online (Sandbox Code Playgroud)
postgres=# SELECT crypt('hello', '$2y$10$fD2cw7T6s4dPvk1SFHmiJeRRaegalE/Oa3zSD6.x5WncQJC9wtCAS');
crypt
---------------
$2JgKNLEdsV2E
(1 Zeile)
Run Code Online (Sandbox Code Playgroud)
我的问题基本上是:
从答案:BCrypt 中使用了 2x 前缀?其中包含有关由实现错误产生的 $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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2153 次 |
| 最近记录: |