2017-02-24 25 views
5

我试图加密我的prostrgres数据库中的一列。列名称是“bytea”类型的“测试”。如何使用Hibernate @ColumnTransformer对Postgres中的列进行加密

我enity代码如下,

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

当我试图找回实体,我越来越像下面的加密数据。如何以编程方式获取解密值?但我得到的实际价值如果我执行postgres选择查询。

"test": "\\xc30d04070302474627ea0994ea657bd24401aaa5543862d57524a407e5dbe2ee0f6f0f33ea4f4474f5bc801dca5d32956d41a975505b12ac000f124177bdc2f4507cbfd724d716aaa513ba46f004dfefd3b2b32eb6" 
  • 当我试图坚持的实体,我得到下面的错误。
  • ERROR: column "test" is of type bytea but expression is of type character varying

    +1

    我认为你反过来放你的函数调用。你应该使用'read =“pgp_sym_decrypt(test,'')”,write =“pgp_sym_encrypt(?,'')”'。 (因为它在数据库中加密并且您想在应用程序中解密)。 – pozs

    +0

    但我不确定这是否是嵌入密钥的正确位置。 – pozs

    回答

    10

    您需要使用pgp_sym_encrypt写入和pgp_sym_decrypt读。你做了相反的事情。

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

    事实上,我非常喜欢你的问题,我甚至还有wrote an article about itexample is on GitHub和工作就像一个魅力。

    +0

    感谢您的回答。改变后的同样问题。而且我想知道,为什么我没有通过我的rest API获取解密的数据。 –

    +0

    我甚至写过关于它的博客文章。 –

    相关问题