Я разрабатываю веб-службу Java, используя Hibernate для подключения к БД. Пользователи будут хранить данные, к которым никто не должен обращаться напрямую, даже из БД.
Есть ли возможность сгенерировать для каждого пользователя ключ, который шифрует / дешифрует данные в БД. Как разделить доступ между группой пользователей?
Как это сделать с помощью Hibernate?
2 ответа
Что касается хранения зашифрованного содержимого в базе данных с помощью Hibernate, я предлагаю вам потратить некоторое время на изучение Hibernate Encryption of Database, полностью прозрачного для приложения . Предлагается ряд вариантов:
- вместо простого соединения JDBC используйте JDBC-over-SSL (без перехвата трафика между приложением и базой данных)
- вместо шифрования определенного содержимого в базе данных используйте что-то вроде TrueCrypt для шифрования жесткого диска, на котором хранятся данные
- использовать специальные Hibernate
UserType
, которые шифруют / дешифруют данные на лету (т.е. вместоString
вы должны использоватьEncryptedString
)
Причина, по которой первые два часто превосходят то, что вы пытаетесь сделать, - это цитата из другого вопроса.
имейте в виду, что любое решение с шифрованием на стороне клиента сделает все ваши данные db непригодными для использования вне клиента, то есть вы не сможете использовать хорошие инструменты, такие как клиент jdbc или браузер запросов MySQL и т. д.
Однако, если вы все еще хотите зашифровать / расшифровать данные на лету с помощью пользовательских Hibernate UserType
, я предлагаю оценить интеграция Jasypt Hibernate, которая предоставляет такие типы.
Прозрачное шифрование / дешифрование
Если ваша база данных поддерживает прозрачное шифрование / дешифрование, это, вероятно, лучший вариант.
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
a> или merge
и расшифровать его при получении объекта.
Похожие вопросы
Связанные вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.
UserType
).