Hibernate - 将列存储为加密,并仅在运行时解密

Jor*_*son 11 java mysql security encryption hibernate

当从hibernate支持的webapp传递时,我有一个需要加密的数据库列.webapp在tomcat 6,Hibernate 4和Mysql上作为后备存储.

但问题是加密/解密此字段的密码只能在程序运行时使用.最初我曾希望使用AES_ENCRYPT/DECRYPT方法,这里概述得很好:

Hibernate中的DataBase加密

和这里:

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

(虽然这确实是指hibernate的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;
}
Run Code Online (Sandbox Code Playgroud)

这要求在注释本身中指定密码,并且不能是变量.

有没有办法以这种方式通过hibernate使用数据库方法,但是将密码作为变量?有更好的方法吗?

Ste*_*ole 3

目前还没有一种方法可以参数化读/写片段的片段。它们更多的是作为通用解决方案。我们已经讨论过在 Hibernate 中添加对 @Encrypted 的支持,大致就像您建议的那样。@Encrypted 将提供更大的灵活性,例如虚拟机内加密与数据库内加密、参数化等。

JPA 2.1 还有一个可以使用的功能,称为属性转换器。然而,他们只能应用虚拟机内加密。