2017-02-24 34 views
5

Tôi đang cố gắng mã hóa một cột trong DB prostrgres của tôi. Tên cột là "kiểm tra" loại "bytea".Làm thế nào để mã hóa một cột trong Postgres bằng cách sử dụng Hibernate @ColumnTransformer

đang enity của tôi là dưới đây,

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

Khi tôi cố gắng lấy lại tổ chức nào, tôi nhận được các dữ liệu được mã hóa như dưới đây. Làm thế nào để tôi có được giá trị giải mã được lập trình? Nhưng tôi nhận được giá trị thực tế Nếu tôi thực hiện một truy vấn chọn postgres.

"test": "\\xc30d04070302474627ea0994ea657bd24401aaa5543862d57524a407e5dbe2ee0f6f0f33ea4f4474f5bc801dca5d32956d41a975505b12ac000f124177bdc2f4507cbfd724d716aaa513ba46f004dfefd3b2b32eb6" 
  1. Khi tôi đang cố gắng để tồn tại đơn vị, tôi nhận được báo lỗi dưới đây.

ERROR: column "test" is of type bytea but expression is of type character varying

+1

Tôi nghĩ bạn đã đặt các cuộc gọi hàm của mình một cách nghịch ngợm. Bạn nên sử dụng một cái gì đó như 'read =" pgp_sym_decrypt (test, '') ", write =" pgp_sym_encrypt (?, '') "'. (Bởi vì nó được mã hóa trong DB & bạn muốn giải mã trong ứng dụng của bạn). – pozs

+0

Nhưng tôi không chắc liệu đó có phải là nơi thích hợp để nhúng khóa của bạn hay không. – pozs

Trả lời

10

Bạn cần phải sử dụng pgp_sym_encrypt để viết và pgp_sym_decrypt để đọc. Bạn đã làm ngược lại.

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

Thực tế, tôi thích câu hỏi của bạn rất nhiều đến mức tôi thậm chí wrote an article about it. Các example is on GitHub và làm việc như một say mê.

+0

Cảm ơn bạn đã trả lời. Cùng một vấn đề sau khi thay đổi. Và tôi cũng tự hỏi, tại sao tôi không nhận được dữ liệu được giải mã thông qua API còn lại của mình. –

+0

Tôi thậm chí đã viết một bài đăng blog về nó. –

Các vấn đề liên quan