1

设想:

我创建了一个表:

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);

问题: 现在我尝试按照此答案中的建议使用加密的昵称列从表中获取记录:

SELECT * FROM knights WHERE nickname = pgp_sym_encrypt('Rigid', 'AES_KEY')::varchar;

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

我的 PostGreSql 版本是 9.6。

4

2 回答 2

1

您的加密数据列应定义为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%')
);
于 2020-06-09T06:50:50.687 回答
0

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

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

于 2020-06-09T12:09:13.673 回答