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



SCENARIO:

我创建了一个表:

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;

我什么也没回来。请注意,我必须将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 模式设置为 0 应该会产生可重复的加密,但实际上并非如此。 也许IV仍然是随机的?

相关内容

  • 没有找到相关文章

最新更新