2015-03-18 3 views
3

Я пытаюсь запросить зашифрованное поле в postgres, используя «pgp_sym_encrypt». Я бегу мой тест, установив все имена в моей таблице зашифрованного значения:Поиск зашифрованного поля в Postgres

update person set first_name = pgp_sym_encrypt('test', 'password'); 

Тогда выбор на нем:

select * from person where first_name = pgp_sym_encrypt('test', 'password'); 

Это не возвращает никаких результатов.

Если изменить его, чтобы использовать шифрование нормальные Postgres он будет возвращать все строки в таблице:

update person set first_name = encrypt('test', 'password', 'aes'); 
select * from person where first_name = encrypt('test', 'password', 'aes'); 

Мой текущий Postgres версия: Postgres (PostgreSQL) 9.4.0. Поле first_name в этом случае является байтовым полем.

Кто-нибудь знает, почему это не работает с помощью «pgp_sym_encrypt»?

Спасибо!

ответ

3

Если посмотреть на PostgreSQL документации (Appendix F.25. pgcrypto - F.25.3. PGP Encryption Functions):

Данный пароль хешируется с использованием алгоритма String2Key (S2K). Это довольно похоже на алгоритмы crypt() - целенаправленно медленные и со случайной солью - но он производит полноразмерный двоичный ключ.

(. Упор мой)

Так следующее дает разные результаты каждый раз, когда вы запускаете его:

select pgp_sym_encrypt('test', 'password'); 

При проверке использования пароля pgp_sym_decrypt вместо этого, можно протестировать, как это:

select pgp_sym_decrypt(pgp_sym_encrypt('test', 'password'), 'password'); 
+0

Итак, если бы я хотел выполнить поиск по данным, зашифрованным с помощью алгоритма S2K, мой единственный вариант - настроить отдельный индекс на безопасный хэш этих данных? – Dalton001

+1

Поиск будет что-то вроде этого? 'select * from person, где 'test' = pgp_sym_decrypt (first_name, 'password');' –

+0

Это сработало! Спасибо! – Dalton001

Смежные вопросы