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仍然是随机的?