如何使用 Hibernate @ColumnTransformer加密 Postgres 中的列

2022-09-03 18:21:48

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

我的 enity 代码如下,

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

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

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

错误:列“test”的类型是 bytea,但表达式的类型是字符可变


答案 1

您需要用于写入和读取。你反其道而行之。pgp_sym_encryptpgp_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支持来代替用户定义的设置。

因此,加密.key存储在配置文件中:postgresql.conf

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

示例位于 GitHub 上,其工作方式类似于魅力。


答案 2

虽然这就像一个魅力,但这不能被视为产品通用解决方案,这不会派上用场,因为在多个数据库上工作将是一个噩梦。可能其他替代方案,如拱顶或使用jasypt将是一个良好的开端!!!


推荐