2013-06-04 24 views
10

當從支持休眠的web應用程序傳遞時,我有一個數據庫列需要加密。該webapp在tomcat 6,Hibernate 4和Mysql上作爲後備存儲。休眠 - 將列存儲爲已加密,並僅在運行時解密

然而問題是加密/解密此字段的密碼只有在程序運行時纔可用。最初,我曾希望使用AES_ENCRYPT /解密方法,概括得很好這裏:

DataBase encryption in Hibernate

這裏:

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/mapping.html#mapping-column-read-and-write

(雖然這並不指休眠的3.6版本,我相信它應該在4.0中相同)。

然而,由於該使用如下標記:

@Column(columnDefinition= "LONGBLOB", name="encryptedBody") 
@ColumnTransformer(
    read="AES_DECRYPT(encryptedBody, 'password')", 
    write="AES_ENCRYPT(?, 'password')") 
public byte[] getEncryptedBody() { 
    return encryptedBody; 
} 

public void setEncryptedBody(byte[] encryptedBody) { 
    this.encryptedBody = encryptedBody; 
} 

這就要求密碼在註釋本身來指定,而不能是一個變量。

有沒有一種方法通過這種方式通過hibernate使用數據庫方法,但將密碼作爲變量?有更好的方法嗎?

+0

我建議使用http://www.jasypt.org/ – sagneta

回答

2

目前還沒有一種方法來參數化這些片段的讀/寫片段。他們更多地意味着通用的解決方案。我們已經討論過在Hibernate中添加對@Encrypted的支持,這大致就像你的建議。 @Encrypted會給予更多的靈活性,如in-vm加密與in-db加密,參數化等。

JPA 2.1還有一個可以使用的功能,稱爲屬性轉換器。但是,他們只能應用in-vm加密。