2017-02-24 103 views
5

Próbuję zaszyfrować kolumnę w mojej bazie danych prostrgres. Nazwa kolumny to "test" typu "bytea".Jak zaszyfrować kolumnę w PostgreSzu przy użyciu Hibernate @ ColumnTransformer

Mój kod enity jest poniżej

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

Kiedy próbowałem odzyskać podmiotu, jestem coraz zaszyfrowane dane jak poniżej. Jak programowo uzyskać odszyfrowaną wartość? Ale otrzymuję rzeczywistą wartość Jeśli wykonam kwerendę wybierz postgres.

"test": "\\xc30d04070302474627ea0994ea657bd24401aaa5543862d57524a407e5dbe2ee0f6f0f33ea4f4474f5bc801dca5d32956d41a975505b12ac000f124177bdc2f4507cbfd724d716aaa513ba46f004dfefd3b2b32eb6" 
  1. Kiedy próbuję utrzymują się podmiot, otrzymuję poniżej błędu.

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

+1

Myślę, że umieściłeś swoje wywołania funkcji odwrotnie. Powinieneś użyć czegoś takiego jak 'read =" pgp_sym_decrypt (test, '') ", write =" pgp_sym_encrypt (?, '') "'. (Ponieważ jest zaszyfrowany w DB i chcesz odszyfrować w swojej aplikacji). – pozs

+0

Ale nie jestem pewien, czy to jest właściwe miejsce do umieszczenia klucza. – pozs

Odpowiedz

10

Trzeba użyć pgp_sym_encrypt dla zapisu i odczytu dla pgp_sym_decrypt. Zrobiłeś coś przeciwnego.

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

Rzeczywiście, tak bardzo lubiłem twoje pytanie, że nawet wrote an article about it. The example is on GitHub i działa jak urok.

+0

Dzięki za odpowiedź. Ten sam problem po zmianie. A także zastanawiam się, dlaczego nie otrzymuję odszyfrowanych danych za pośrednictwem mojego interfejsu API odpoczynku. –

+0

Nawet napisałem post na blogu na ten temat. –