一尘不染

在Postgres中搜索加密字段

sql

我正在尝试使用“ pgp_sym_encrypt”在postgres中查询一个加密字段。我通过将表中的所有名字设置为加密值来运行测试:

update person set first_name = pgp_sym_encrypt('test', 'password');

然后选择:

select * from person where first_name = pgp_sym_encrypt('test', 'password');

这将不返回任何结果。

如果我将其更改为使用常规的postgres加密,它将返回表中的所有行:

update person set first_name = encrypt('test', 'password', 'aes');
select * from person where first_name = encrypt('test', 'password', 'aes');

我当前的postgres版本是:postgres(PostgreSQL)9.4.0。在这种情况下,first_name字段是一个bytea字段。

有谁知道为什么不能使用“ pgp_sym_encrypt”来工作?

谢谢!


阅读 176

收藏
2021-05-23

共1个答案

一尘不染

如果查看PostgreSQL文档(附录F.25。pgcrypto-F.25.3。PGP加密函数):

给定的密​​码使用String2Key(S2K)算法进行哈希处理。这与crypt()算法``故意缓慢且 带有随机盐
‘’非常相似,但它会生成全长的二进制密钥。

(强调我的。)

因此,以下内容在您每次运行时都会给出不同的结果:

select pgp_sym_encrypt('test', 'password');

当测试使用密码时pgp_sym_decrypt,可以像这样进行测试:

select pgp_sym_decrypt(pgp_sym_encrypt('test', 'password'), 'password');
2021-05-23