【问题标题】:How to encrypt a column in Postgres using Hibernate @ColumnTransformer如何使用 Hibernate @ColumnTransformer 加密 Postgres 中的列
【发布时间】:2017-07-15 05:43:12
【问题描述】:

我正在尝试加密我的 prostrgres 数据库中的列。列名是“bytea”类型的“test”。

我的实体代码如下,

@ColumnTransformer(
          forColumn="test", 
          read="pgp_sym_encrypt(test::bytea, 'mySecretKey')", 
          write="pgp_sym_decrypt(?, 'mySecretKey')")
private String test;

当我尝试检索实体时,我得到了如下所示的加密数据。如何以编程方式获取解密的值?但如果我执行 postgres 选择查询,我会得到实际值。

  "test": "\\xc30d04070302474627ea0994ea657bd24401aaa5543862d57524a407e5dbe2ee0f6f0f33ea4f4474f5bc801dca5d32956d41a975505b12ac000f124177bdc2f4507cbfd724d716aaa513ba46f004dfefd3b2b32eb6"
  1. 当我尝试持久化实体时,出现以下错误。

错误:列“test”的类型为 bytea,但表达式的类型为 性格不同

【问题讨论】:

  • 我认为你的函数调用是相反的。你应该使用read="pgp_sym_decrypt(test, '<key>')", write="pgp_sym_encrypt(?, '<key>')" 之类的东西。 (因为它在数据库中被加密并且您希望在您的应用程序中解密)。
  • 但我不确定这是否是嵌入密钥的正确位置。

标签: java postgresql hibernate encryption orm


【解决方案1】:

虽然这很有魅力,但不能将其视为产品通用解决方案,而且这并不方便,因为处理多个数据库将是一场噩梦。可能是其他替代方案,如 Vaulting 或使用 jasypt 将是一个好的开始!!!

【讨论】:

    【解决方案2】:

    您需要使用pgp_sym_encrypt 进行写入,使用pgp_sym_decrypt 进行读取。你反其道而行之。

    @ColumnTransformer(
        read =  "pgp_sym_decrypt(" +
                "    test, " +
                "    current_setting('encrypt.key')" +
                ")",
        write = "pgp_sym_encrypt( " +
                "    ?, " +
                "    current_setting('encrypt.key')" +
                ") "
    )
    @Column(columnDefinition = "bytea")
    private String test;
    

    因为在映射中硬编码加密密钥听起来不是一个好主意,所以我们将使用 PostgreSQL 对用户定义设置的支持。

    所以,encrypt.key 存储在postgresql.conf配置文件中:

    encrypt.key = 'Wow! So much security.'
    

    example is on GitHub 就像一个魅力。

    【讨论】:

    • 感谢您的回答。更改后同样的问题。而且我想知道,为什么我没有通过我的 REST API 获取解密数据。
    • 像魅力一样工作..数据库字段的类型应该是 bytea
    • 这很好,但有没有办法告诉 Hibernate 从 application.properties 读取“mySecretKey”?我们有将密钥存储在网络应用程序而不是 postgres 中的用例
    • 您可以通过自定义 Hibernate Type 来做到这一点。
    • 如何使用自定义的 Hibernate Type 来做到这一点?
    猜你喜欢
    • 2019-08-12
    • 2022-09-23
    • 2021-07-29
    • 2015-02-24
    • 2018-08-09
    • 2022-09-25
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多