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 仍然是随机的?
情景:
我创建了一个 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 仍然是随机的?