【问题标题】:How to externalize the Postgresql column encryption key with Spring Boot JPA?如何使用 Spring Boot JPA 将 Postgresql 列加密密钥外部化?
【发布时间】: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


【解决方案1】:

有一个可用的答案here。这里的问题是它将数据存储在 application.properties 中。在生产系统中,这种解决方案并不是最好的,因为它会根据客户的不同而改变。

但是您可以使用相同的结构并以另一种方式定义您的 secret.key,您可以根据您的客户特定密钥进行更改(例如,从安全存储中获取)。请记住,如果您有多个客户,最好为每个客户设置单独的密钥。

也许将 setKey() 方法的可见性更改为 public 会很有趣,一旦在多租户环境中工作将不允许您在构造函数中定义此键。我仍然需要更多地测试这种公开的方法,因为它也会影响应用程序的职责分离。

【讨论】:

    猜你喜欢
    • 2017-01-27
    • 2018-11-04
    • 2019-11-29
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2021-12-18
    • 2018-07-04
    • 2014-10-19
    相关资源
    最近更新 更多