我正在开发一个需要加密某些数据库表字段的项目。这样做的方法是使用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
所以我的问题是如何使用现有的OR映射在Hibernate中使用它?我正在使用JPA Annotations。 使用JPA注释有一种简单的方法吗?
答案 0 :(得分:9)
听起来像是在寻找org.hibernate.annotations.ColumnTransformer
@Column( name = "pswd" )
@ColumnTransformer( write="EncryptByPassPhrase('12',?)", read="DECRYPTBYPASSPHRASE ('12',pswd)" )
public String getPassword() {
return password;
}
答案 1 :(得分:6)
恢复旧线程,但我有类似的要求,发现Jasypt对此有一些非常好的支持。
配置Jasypt后,就像添加“@Type(type="encryptedString")
”注释一样简单:
@Column(name = "password")
@Type(type="encryptedString")
public String getPassword() {
return password;
}
答案 2 :(得分:3)
我不知道你会怎么做。但是从我读过的内容来看,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-Server加密的内容,反之亦然。