【发布时间】:2021-03-08 08:00:49
【问题描述】:
我创建了一个触发器和一个触发器函数,它在表上的每个更新操作上调用并加密一个特定值,如下所示:
create trigger project_trigger
before update
on projects
for each row
execute procedure project_function();
create or replace function project_function()
returns trigger as
$BODY$
begin
IF (TG_OP = 'UPDATE') THEN
NEW.title = armor(pgp_sym_encrypt(NEW.title, 'cipher-algo=aes256' ));
return NEW;
END IF;
end;
$BODY$
language plpgsql;
上述加密方法工作正常,一个装甲的 PGP 加密值保存如下:
-----BEGIN PGP MESSAGE-----
ww0EBwMCneBsNZw1gYFq0jYB9y58EoTaRXWmDFqvQArWU5tZ+wS+7yAm9ycVUpkH1EzvYLbfRoDj
rqR83I0nGErHcLSLlAs=
=IYg8
-----END PGP MESSAGE-----
解密需要在我遵循以下两个步骤的应用程序级别完成:
- 添加了 bcpg-jdk15on 和 bcprov-jdk15on 依赖项。 (v1.47)
- 实施:
String key = "aes_key";
File file = new File("D:\\file.txt.asc"); //this file contains the PGP encrypted value as shown above
InputStream input = new FileInputStream(file);
byte[] byt = new byte[input.available()];
input.read(byt);
input.close();
Security.addProvider(new BouncyCastleProvider());
System.out.println(new String(ByteArrayHandler.decrypt(byt,
key.toCharArray())));
在使用上述方法解密值时,我不断收到以下异常:
线程“main”中的异常 org.bouncycastle.openpgp.PGPDataValidationException:数据检查 失败的。在 org.bouncycastle.openpgp.PGPPBEEncryptedData.getDataStream(未知 来源)在 org.bouncycastle.openpgp.examples.ByteArrayHandler.decrypt(未知 来源)在 abc.demo.encryption.SymmetricDecyption.main(SymmetricDecyption.java:59)
那么有人可以指导我在应用程序级别(而不是在查询中)实现解密的适当方法。
【问题讨论】:
-
将值本身用作密码是没有意义的,因为您需要密码才能解密数据。
-
@LaurenzAlbe 请检查一下,这实际上是加密密钥
-
我说的是PostgreSQL函数。您正在调用
pgp_sym_encrypt_bytea并使用要加密的字符串作为密码。再想想。 -
@LaurenzAlbe 我将在 conf 文件中配置加密密钥或在下一阶段从数据库中读取它,这只是一个 poc,解密无法按预期工作
-
加密工作正常,但您无法在不知道密码的情况下解密邮件。如果您将密码存储在数据库中,您还不如存储未加密的数据,因为加密不提供任何保护。我认为你应该接受一些关于加密的基础教育。
标签: java postgresql encryption pgp pgcrypto