在Postgres中搜索加密字段

时间:2015-03-18 12:55:15

标签: sql postgresql security encryption

我尝试使用" 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"?

谢谢!

1 个答案:

答案 0 :(得分:5)

如果你看一下PostgreSQL文档(Appendix F.25. pgcrypto - F.25.3. PGP Encryption Functions):

  

使用String2Key(S2K)算法对给定密码进行哈希处理。这与crypt()算法非常类似 - 有目的地缓慢和随机盐 - 但它产生一个全长二进制密钥。

(强调我的。)

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

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

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

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