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

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

password_hash($password, PASSWORD_DEFAULT);

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

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

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

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

  • Я делаю это неправильно?
  • Если это невозможно: есть ли путь миграции, чтобы сделать это возможным?
$2y$ — это специфичный для PHP алгоритм, поскольку в его $2a$ реализации была ошибка, IIRC. Проблема, вероятно, в том, что очень немногие другие системы поддерживают его.
deceze 07.04.2019 11:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
1 341
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

There is no difference between 2a, 2x, 2y, and 2b. If you wrote your implementation correctly, they all output the same result.

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

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

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

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

Вау... Спасибо, что поделились/расследовали это!

madflow 08.04.2019 11:54

Другие вопросы по теме