#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-Сервер, и наоборот.