Как прочитать зашифрованное поле базы данных с помощью гибернации

#java #sql-server #hibernate #jpa

#java #sql-сервер #гибернация #jpa

Вопрос:

Я работаю над проектом, в котором некоторые поля таблицы базы данных должны быть зашифрованы. Это будет сделано с помощью встроенной функции шифрования / дешифрования Microsoft SQL Server:

 ENCRYPTBYPASSPHRASE('PASSPHRASE',‘text’)

DECRYPTBYPASSPHRASE ('12',password)
  

Итак, для вставки данных SQL будет выглядеть следующим образом:

 insert into login_details(uid,username,password) values(1,'smith',EncryptByPassPhrase('12',’XXX’))
  

И для чтения данных SQL будет таким образом:

 select uid,username, DECRYPTBYPASSPHRASE ('12',password) as Password from login_details
  

Итак, мой вопрос в том, как я могу использовать это в Hibernate, используя мои существующие сопоставления OR? Я использую аннотации JPA.
Есть ли простой способ сделать это с помощью аннотаций JPA?

Ответ №1:

Похоже, вы ищете org.hibernate.annotations.ColumnTransformer

 @Column( name = "pswd" )
@ColumnTransformer( write="EncryptByPassPhrase('12',?)", read="DECRYPTBYPASSPHRASE ('12',pswd)" )
public String getPassword() {
    return password;
}
  

Ответ №2:

Восстанавливаю старый поток, но у меня было аналогичное требование, и я обнаружил, что у Jasypt есть очень хорошая поддержка для этого.

После настройки Jasypt это так же просто, как добавить аннотацию « @Type(type="encryptedString") «:

 @Column(name = "password")
@Type(type="encryptedString")
public String getPassword() {
    return password;
}
  

Ответ №3:

Я не понимаю, как вы могли бы это сделать. Но из того, что я прочитал, ENCRYPTBYPASSPHRASE использует triple-DES. Таким образом, вы можете самостоятельно зашифровать данные и сохранить их как есть с помощью Hibernate. Вот как это выглядело бы, если бы сделать его прозрачным (за исключением запросов, очевидно)

 @Entity
public class LoginDetails {
    @Column(name = "password")
    private byte[] encryptedPassword;

    @Transient
    private String password;

    public void getPassword() {
        if (password == null) {
            password = CryptoUtils.decrypt(encryptedPassword);
        }
        return password;
    }

    public void setPassword(String password) {
        this.encryptedPassword = CryptoUtils.encrypt(password);
        this.password = password;
    }
}
  

где CryptoUtils будет отвечать за хранение секретного ключа и шифрование / дешифрование с использованием triple-DES (который изначально поддерживается в JDK: см. http://download.oracle.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.html#Cipher )

Просто не забудьте протестировать его и убедиться, что ваше дешифрование способно расшифровать то, что зашифровал SQL-Сервер, и наоборот.