Ошибка при использовании функции дайджеста PostgreSQL при попытке проверить пароль

Я использую PostgreSQL 9.5 и пытаюсь понять, как хранить пароли с функциями дайджеста и шифрования в модуле pgcrypto. У меня есть такая таблица:

CREATE TABLE "usuarios" (
"id" integer NOT NULL ,
"password" varchar(120),
CONSTRAINT usuarios_pk PRIMARY KEY ("id")
);

Я успешно сохранил первую строку с этим запросом:

INSERT INTO public.usuarios VALUES (DEFAULT,digest('somesalt' || 'mypass','sha256'));

Я взял идею глобальной соли и дайджеста с использованием алгоритма sha256, прочитав этот пост и официальную документацию, следуя примеру использования crypt( )

Моя проблема в том, что когда я пытаюсь сравнить пароль в pgAdmin со следующим запросом:

SELECT (usuarios.password = digest('somesalt' || 'mypass','sha256')) AS Match FROM usuarios; 

Я получаю сообщение об ошибке несоответствия типа пароля (varchar) и типа дайджеста (bytea). Я искал обходной путь или то, каким будет актерский состав, но не могу его найти или, может быть, не могу понять, что у меня под носом. Любая помощь?


person Edgar Sampere    schedule 02.03.2016    source источник


Ответы (1)


Вам нужно привести свой дайджест, например (обратите внимание на ::varchar после дайджеста):

SELECT (usuarios.password = digest('somesalt' || 'mypass','sha256')::varchar) AS Match FROM usuarios;

Также обратите внимание, что sha256 не совсем подходит для хеширования паролей, а PostgreSQL имеет лучшие функции для хеширования паролей. Также см. этот ответ SO.

person hruske    schedule 02.03.2016
comment
Отредактировано. Так что лучше использовать крипту, чем дайджест? Потому что очевидно, что md5 не вариант, поэтому, если я использую crypt, какой хороший алгоритм можно использовать? Или postgres md5 отличается от оригинального md5, можно ли его использовать? - person Edgar Sampere; 03.03.2016
comment
Да, если это возможно с алгоритмом bf. Эта таблица в документации показывает, насколько устойчивы алгоритмы шифрования к брутфорсу: postgresql.org/docs/current/static/ - person hruske; 03.03.2016
comment
О!, спасибо, я немного запутался, какую функцию использовать - person Edgar Sampere; 03.03.2016