我正在尝试使用“ 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”来工作?
谢谢!
如果查看PostgreSQL文档(附录F.25。pgcrypto-F.25.3。PGP加密函数):
给定的密码使用String2Key(S2K)算法进行哈希处理。这与crypt()算法``故意缓慢且 带有随机盐 ‘’非常相似,但它会生成全长的二进制密钥。
(强调我的。)
因此,以下内容在您每次运行时都会给出不同的结果:
select pgp_sym_encrypt('test', 'password');
当测试使用密码时pgp_sym_decrypt,可以像这样进行测试:
pgp_sym_decrypt
select pgp_sym_decrypt(pgp_sym_encrypt('test', 'password'), 'password');