Я разрабатываю веб-службу Java, используя Hibernate для подключения к БД. Пользователи будут хранить данные, к которым никто не должен обращаться напрямую, даже из БД.

Есть ли возможность сгенерировать для каждого пользователя ключ, который шифрует / дешифрует данные в БД. Как разделить доступ между группой пользователей?

Как это сделать с помощью Hibernate?

5
Mr Jedi 23 Мар 2014 в 18:45

2 ответа

Лучший ответ

Что касается хранения зашифрованного содержимого в базе данных с помощью Hibernate, я предлагаю вам потратить некоторое время на изучение Hibernate Encryption of Database, полностью прозрачного для приложения . Предлагается ряд вариантов:

  • вместо простого соединения JDBC используйте JDBC-over-SSL (без перехвата трафика между приложением и базой данных)
  • вместо шифрования определенного содержимого в базе данных используйте что-то вроде TrueCrypt для шифрования жесткого диска, на котором хранятся данные
  • использовать специальные Hibernate UserType, которые шифруют / дешифруют данные на лету (т.е. вместо String вы должны использовать EncryptedString)

Причина, по которой первые два часто превосходят то, что вы пытаетесь сделать, - это цитата из другого вопроса.

имейте в виду, что любое решение с шифрованием на стороне клиента сделает все ваши данные db непригодными для использования вне клиента, то есть вы не сможете использовать хорошие инструменты, такие как клиент jdbc или браузер запросов MySQL и т. д.

Однако, если вы все еще хотите зашифровать / расшифровать данные на лету с помощью пользовательских Hibernate UserType, я предлагаю оценить интеграция Jasypt Hibernate, которая предоставляет такие типы.

3
Community 23 Май 2017 в 13:29
Администраторы тоже не должны иметь доступа к данным (то есть не могут знать, что именно хранится у пользователя). Итак, мое решение использует Jasypt?
 – 
Mr Jedi
25 Мар 2014 в 18:45
Если вы можете смириться с последствиями этого решения, тогда да, используйте Jasypt (или пользовательские UserType).
 – 
Marcel Stör
25 Мар 2014 в 19:04

Прозрачное шифрование / дешифрование

Если ваша база данных поддерживает прозрачное шифрование / дешифрование, это, вероятно, лучший вариант.

Jasypt

Другой вариант - использовать Jasypt, который предлагает широкий спектр типов Hibernate для шифрования / дешифрования данных. .

Использование @ColumnTransformer

Очень простой способ зашифровать / расшифровать атрибут объекта - использовать @ColumnTransformer вот так:

@ColumnTransformer(
    read = """
        pgp_sym_decrypt(
            storage,
            current_setting('encrypt.key')
        )
        """,
    write = """
        pgp_sym_encrypt(
            ?,
            current_setting('encrypt.key')
        )
        """
)
@Column(columnDefinition = "bytea")
private String storage;

Таким образом, Hibernate сможет зашифровать атрибут объекта, когда вы persist или merge и расшифровать его при получении объекта.

2
Vlad Mihalcea 10 Янв 2021 в 17:33