Hibernate - сохранение столбца в зашифрованном виде и дешифрование только во время выполнения
У меня есть столбец базы данных, который нужно зашифровать, когда он передается из поддерживаемого hibernate webapp. Webapp находится на tomcat 6, Hibernate 4 и Mysql в качестве хранилища резервных копий.
Однако проблема заключается в том, что пароль для шифрования/дешифрования этого поля будет доступен только во время выполнения программы. Первоначально я надеялся использовать методы AES_ENCRYPT/DECRYPT, изложенные здесь довольно хорошо:
Шифрование DataBase в Hibernate
и здесь:
http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/mapping.html#mapping-column-read-and-write
(Хотя это относится к версии 3.6 спящего режима, я считаю, что она должна быть одинаковой в 4.0).
Однако, поскольку для этого используются следующие обозначения:
@Column(columnDefinition= "LONGBLOB", name="encryptedBody")
@ColumnTransformer(
read="AES_DECRYPT(encryptedBody, 'password')",
write="AES_ENCRYPT(?, 'password')")
public byte[] getEncryptedBody() {
return encryptedBody;
}
public void setEncryptedBody(byte[] encryptedBody) {
this.encryptedBody = encryptedBody;
}
Это требует, чтобы пароль был указан в самой аннотации и не может быть переменной.
Есть ли способ использовать методы базы данных с помощью hibernate таким образом, но с паролем как переменной? Есть ли лучший подход?
Ответы
Ответ 1
В настоящее время нет возможности параметризовать фрагменты фрагментов чтения/записи. Они больше понимаются как решения общего назначения. Мы обсудили добавление поддержки @Encrypted в Hibernate, которая будет примерно так же, как вы предлагаете. @Encrypted даст больше гибкости, например, в-vm crypto по сравнению с in-db crypto, параметризацией и т.д.
JPA 2.1 также имеет функцию, которую вы можете использовать, называемые преобразователями атрибутов. Однако они могли бы применять только криптографию in-vm.