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

时间:2017-02-24 11:45:47

标签: java postgresql hibernate encryption orm

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

我的enity代码如下,

  "test": "\\xc30d04070302474627ea0994ea657bd24401aaa5543862d57524a407e5dbe2ee0f6f0f33ea4f4474f5bc801dca5d32956d41a975505b12ac000f124177bdc2f4507cbfd724d716aaa513ba46f004dfefd3b2b32eb6"

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

\t
  1. 当我试图坚持实体时,我收到以下错误。
  2.   

    错误:专栏"测试"是bytea类型但表达式是类型   性格变化

1 个答案:

答案 0 :(得分:16)

您需要使用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.'

事实上,我非常喜欢你的问题,甚至我wrote an article about itexample is on GitHub并且像魅力一样工作。