如何使用Hibernate读取加密的数据库字段

时间:2011-05-03 14:49:54

标签: java sql-server hibernate 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

所以我的问题是如何使用现有的OR映射在Hibernate中使用它?我正在使用JPA Annotations。 使用JPA注释有一种简单的方法吗?

3 个答案:

答案 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加密的内容,反之亦然。