PostgreSql:如何使用加密列进行查询

PostgreSql: How to query using encrypted columns

情景:

我创建了一个 table:

Create table knights(age integer, nickname varchar(255));

然后我插入了几条记录并使用pgcrypto加密了昵称列数据:

insert into knights values(21, PGP_SYM_ENCRYPT('ShiningArmor','AES_KEY')::varchar);
insert into knights values(32, PGP_SYM_ENCRYPT('Rigid','AES_KEY')::varchar);

问题: 现在我尝试按照 this answer:

中的建议使用加密的昵称列从 table 获取记录
SELECT * FROM knights WHERE nickname = pgp_sym_encrypt('Rigid', 'AES_KEY')::varchar;

我一无所获。请注意,我必须将 nickname 转换为 varchar。即使我将列类型更改为 bytea,我仍然一无所获。请注意,我的对称密钥实际上是相同的:AES_KEY。我没有在任何地方生成它。我需要更改长度吗?

我的 PostGreSql 版本是 9.6。

您的加密数据列应定义为bytea

当您正在阅读查询时,应该如下所示,

SELECT 
    PGP_SYM_DECRYPT(nickname::bytea, 'AES_KEY') as name,
FROM knights WHERE ( 
    LOWER(PGP_SYM_DECRYPT(nickname::bytea, 'AES_KEY')
    LIKE LOWER('%Rigid%')
);

pgp_sym_encrypt 使用盐,因此每次使用相同的密码加密相同的值时不会得到相同的答案。正如公认的答案所暗示的那样,答案是使用解密而不是加密进行测试。

似乎将 s2k-mode 设置为 0 应该会产生可重复的加密,但在实验中它不会。也许 IV 仍然是随机的?