Я использую расширение pgcrypto в Postgresql для шифрования и хранения паролей пользователей в базе данных, и у меня возникают проблемы с их извлечением.
В частности, оператор вставки для пользователя выглядит следующим образом:
INSERT INTO Users (username, password) VALUES ('test1', crypt('Password1234', gen_salt('bf', 8)));
Однако это отлично работает, когда я пытаюсь получить из базы данных этот запрос:
SELECT username, password FROM Users WHERE username = 'test1' AND password = crypt('Password1234', gen_salt('bf', 8));
не возвращает никаких результатов, запрос не завершается ошибкой, просто нет результатов.
В настоящее время я не использую python для взаимодействия с базой данных (буду использовать в будущем), я просто использую psql в терминале. Я знаю, что что-то не так с этим запросом, но я не уверен, что и как это исправить. Есть ли другой способ структурировать это или что я делаю неправильно? Спасибо за любую помощь!
Вы повторно заправляете пароль новой солью, что, конечно же, приводит к другому ответу, чем раньше. В этом весь смысл соления.
Вам нужно повторно использовать первую соль в новом хешировании, что вы делаете, вводя хэш пароля вместо gen_salt(...)
. (Сохраненный хешированный пароль содержит встроенную в него соль, и crypt знает, как ее извлечь и повторно использовать).
SELECT username, password FROM Users WHERE username = 'test1' AND password = crypt('Password1234', password);
Но почему вы выбираете «пароль»? После того, как вы убедились, что это правильные хэши, какой дальнейший смысл в их просмотре?
Большое спасибо! Я думаю, что произошло то, что я неправильно понял инструкции в руководстве, на которое я смотрел.