2011-05-03 72 views
2

我工作的一個項目中,一些數據庫表字段需要加密讀取加密數據庫字段。這將實現的方法是使用Microsoft SQL Server內置的加密/解密功能:如何使用Hibernate

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中?我正在使用JPA註釋。 有沒有簡單的方法來做到這一點與JPA批註?

回答

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將負責存儲密鑰和加密/使用三重DES(這是在JDK原生支持解密:請參閱http://download.oracle.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.html#Cipher

只要確保測試它並確保您的解密能夠解密SQL-Server已加密的內容,反之亦然。

+0

感謝我給它一個嘗試。 – Marquinio 2011-05-04 02:47:53

8

聽起來像是你正在尋找org.hibernate.annotations.ColumnTransformer

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

回想起一個古老的線程,但我有一個類似的要求,發現Jasypt有這一些非常好的支持。

一旦配置Jasypt,這是因爲加入了「@Type(type="encryptedString")」註釋爲簡單:

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