Используйте pgcrypto для проверки паролей, сгенерированных password_hash - PullRequest
1 голос
/ 07 апреля 2019

У меня есть хэши паролей, хранящиеся в базе данных Postgresql, сгенерированной с помощью:

password_hash($password, PASSWORD_DEFAULT);

Теперь я хотел бы также иметь возможность проверить пароль пользователя с помощью Postgresql и pgcrypto.

Но функция crypt() в pgcrypto не может проверить существующие хэши паролей.

Однако - я могу проверить хэши паролей, сгенерированные Postgresql, с помощью PHP 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)

Мои вопросы в основном:

  • Я делаю это неправильно?
  • Если это невозможно: есть ли способ миграции, чтобы сделать это возможным?

1 Ответ

2 голосов
/ 07 апреля 2019

Из ответа на: Где в BCrypt используется 2x префикс? , который содержит все подробности о вариантах $ 2 $, порожденных ошибками реализации:

Нет разницы между 2a, 2x, 2y и 2b . Если вы написали свой реализация правильно, все они выдают один и тот же результат.

Исходя из этого, можно взять хеш, сгенерированный PHP password_hash, заменить ведущий $2y$ на $2a$ и передать его как второй аргумент crypt().

в pgcrypto.

Используя значение из вашего примера:

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

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