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.