【发布时间】:2021-01-03 12:47:02
【问题描述】:
我的一个 Postgresql 实体有一个加密列,我想在使用 Spring Boot JPA 读取它时对其进行解密。 加密的实体字段使用硬编码密码解密:
@ColumnTransformer(
read = "pgp_sym_decrypt(secretField::bytea, 'secr3t'),
write = "pgp_sym_decrypt(?, 'secr3t')
)
private String secretField;
我想将 'secr3t' 密码外部化,因此不再对其进行硬编码。但我无法做到这一点,因为:
- Spring Boot 注解只能包含常量字符串(
@Value("${encrypt.key}")无法从 application.properties 中读取) - 我发现
current_setting('encrypt.key')行写在read = "pgp_sym_decrypt(secretField::bytea, current_setting('encrypt.key')),但它告诉我org.postgresql.util.PSQLException: ERROR: unrecognized configuration parameter "encrypt.key",即使我在encrypt.key中声明application.properties。我读到这个参数应该写在服务器端的postgresql.conf配置文件中,但是在客户端没有密码反而感觉很奇怪。
有没有办法用 Spring Boot JPA 解密 Postgresql 列而不用硬编码密码?
我真的认为application.properties 中会有一行我可以为此编写,因为客户端密钥是可能的,它只是...由 JPA 常量值限制硬编码。
我在https://www.postgresql.org/docs/8.3/pgcrypto.html 或 Spring Boot 文档中没有找到任何关于 Spring Boot JPA 解密的内容。每个人似乎都只是用硬编码的密钥来举例。
相关问题:
【问题讨论】:
-
注解只能包含静态信息(与Java中定义的Spring Boot无关)。此外,密码实际上应该在数据库端而不是客户端。所以你认为奇怪的实际上是处理它的方法。或者不要使用
@ColumnTransformer,而是使用@AttributeConverter或执行转换的用户类型。 -
@AttributeConverter方法很有趣,但我需要手动解密数据,对吧?在这种情况下,知道 Postgres 用于加密的初始化验证器的方法是什么?是否有手动 Postgres 解密的示例(无论是什么语言)?
标签: postgresql spring-boot encryption