Сильный огонь с использованием типов postgres jsonb и pgcrypto - PullRequest
0 голосов
/ 12 мая 2018

У меня есть таблица postgres с столбцом jsonb , цель состоит в том, чтобы вставить гибкие документы, чтобы затем выполнить некоторые операции поиска

Давайте начнем с таблицы и некоторых наглядных данных:

create table my_table (id serial primary key, label text, document jsonb);

insert into my_table (label, document) values ('white', '{"name": "john", "lastname": "doe", "eyes": "brown", "birth": "07/08/1979 19:12:55", "pet": "dinosour", "wife": "872", "cat": "no"}');
insert into my_table (label, document) values ('lemon', '{"name": "jane", "lastname": "doe", "birth": "07/08/1978 19:12:55", "cat": "yes"}');
insert into my_table (label, document) values ('white', '{"name": "peter", "eyes": "blue", "birth": "07/08/1980 19:12:55", "pet": "worm", "dog": "yes"}');
insert into my_table (label, document) values ('cyanide', '{"name": "peter", "lastname": "doe", "doormat": "yes"}');

Когда данные начинают поступать в процессе создания некоторых индексов (вот почему тип столбца jsonb), например:

create index on my_table (((document->>'name')::text)) WHERE (document->>'name') is not null and label = 'white';
create index on my_table (((document->>'lastname')::text)) WHERE (document->>'lastname') is not null and label = 'lemon';
create index on my_table (((document->>'doormat')::text)) WHERE (document->>'doormat') is not null and label = 'cyanide';

На данный момент все работает, как и ожидалось, мы можем выполнить хороший поиск с хорошей производительностью, например:

select * from my_table
where to_timestamp(document->>'birth', 'DD/MM/YYYY HH24:MI:SS')  
    between to_timestamp('07/08/1979 00:00:00', 'DD/MM/YYYY HH24:MI:SS') 
    and     to_timestamp('07/08/1979 23:59:59', 'DD/MM/YYYY HH24:MI:SS');

select * from my_table where document->>'cat' = 'yes' or document->>'eyes' = 'brown';

ПРОБЛЕМА заключается в том, что теперь нам нужно зашифровать эту информацию в базе данных, как я обычно это делаю с pgcrypto, но я не могу найти способ зашифровать jsonb type без потери все возможности индексации или возможности поиска в поле возвращают меня в очень примитивное состояние.

мы нашли слишком мало информации о pgcrypto с типами jsonb, например: Postgresql - шифрование данных jsonb и документация pgcrypto ничего не говорит о типах jsonb https://www.postgresql.org/docs/10/static/pgcrypto.html

Есть ли способ, которым мы могли бы сделать что-то вроде pgp_sym_decrypt (jsonb, 'secret')? или другой механизм, где мы можем зашифровать данные, не теряя хотя бы возможности поиска по полю? (мы можем пожертвовать индексацией)

Заранее спасибо,

1 Ответ

0 голосов
/ 13 мая 2018

Спасибо @Jasen, ваш комментарий заставил меня задуматься ... поскольку я сказал, что мы можем пожертвовать индексацией, тогда не должно быть никаких проблем при хранении зашифрованных данных в виде bytea и при необходимости их приведения к jsonb,используя что-то вроде:

... where (pgp_sym_decrypt(document, 'secret')::jsonb)->>'name' = 'peter';
...