0

我有一个带有jsonb 列的postgres表,目的是插入灵活的文档,然后进行一些搜索

让我们从表格和一些示范数据开始:

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 类型而不会失去所有索引能力或字段的搜索能力,这将我推回到一个非常原始状态。

我们发现关于带有 jsonb 类型的 pgcrypto 的信息太少了,例如:Postgresql - 加密 jsonb 数据和 pgcrypto 文档没有说明任何关于 jsonb 类型的信息https://www.postgresql.org/docs/10/static/pgcrypto。 html

有没有办法我们可以做类似 pgp_sym_decrypt(jsonb, 'secret') 的事情?或者我们可以加密数据而不会丢失至少字段搜索能力的另一种机制?(我们可以牺牲索引)

提前致谢,

4

1 回答 1

0

谢谢@Jasen,您的评论让我思考......正如我所说,我们可以牺牲索引然后将加密数据存储为 bytea 并在需要时将其转换回 jsonb 应该没有问题,使用类似的东西:

... where (pgp_sym_decrypt(document, 'secret')::jsonb)->>'name' = 'peter';
于 2018-05-13T14:56:53.427 回答