Как прочитать зашифрованное поле базы данных с помощью Hibernate - PullRequest
2 голосов
/ 03 мая 2011

Я работаю над проектом, в котором некоторые поля таблицы базы данных должны быть зашифрованы. Для этого будет использоваться встроенная функция шифрования / дешифрования 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?

Ответы [ 3 ]

9 голосов
/ 19 мая 2012

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

@Column( name = "pswd" )
@ColumnTransformer( write="EncryptByPassPhrase('12',?)", read="DECRYPTBYPASSPHRASE ('12',pswd)" )
public String getPassword() {
    return password;
}
6 голосов
/ 25 февраля 2013

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

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

@Column(name = "password")
@Type(type="encryptedString")
public String getPassword() {
    return password;
}
3 голосов
/ 03 мая 2011

Я не понимаю, как ты мог это сделать.Но из того, что я прочитал, ENCRYPTBYPASSPHRASE использует тройной 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-сервер, и наоборот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...