【发布时间】:2011-04-11 12:42:45
【问题描述】:
使用hibernate时如何加密数据库字段?
我们已经开发了一些客户正在使用该应用程序的产品一些客户正在询问数据库加密 是否有可能在不更改代码的情况下在应用程序级别加密数据。
请尽快给我建议。
【问题讨论】:
使用hibernate时如何加密数据库字段?
我们已经开发了一些客户正在使用该应用程序的产品一些客户正在询问数据库加密 是否有可能在不更改代码的情况下在应用程序级别加密数据。
请尽快给我建议。
【问题讨论】:
试试这个:
在你的实体中添加一个属性:
private byte[] encryptedBody;
使用这个 getter 和 setter:
@Column(columnDefinition= "LONGBLOB", name="encryptedBody")
@ColumnTransformer(
read="AES_DECRYPT(encryptedBody, 'yourkey')",
write="AES_ENCRYPT(?, 'yourkey')")
public byte[] getEncryptedBody() {
return encryptedBody;
}
public void setEncryptedBody(byte[] encryptedBody) {
this.encryptedBody = encryptedBody;
}
然后当您检索列时使用:
private final Charset UTF8_CHARSET = Charset.forName("UTF-8");
String decodeUTF8(byte[] bytes) {
return new String(bytes, UTF8_CHARSET);
}
String s = decodeUTF8(entity.getEncryptedBody());
注意:AES_DECRYPT 和 AES_ENCRYPT 属于 MySQL。如果您有不同的数据库引擎,请找到类似的功能。
希望这会有所帮助。
【讨论】:
你可以像这样使用@ColumnTransformer注解:
@ColumnTransformer(
read = "pgp_sym_decrypt(" +
" storage, " +
" current_setting('encrypt.key')" +
")",
write = "pgp_sym_encrypt( " +
" ?, " +
" current_setting('encrypt.key')" +
") "
)
@Column(columnDefinition = "bytea")
private String storage;
这样,Hibernate 将能够在您persist or merge 时加密实体属性,并在您读取实体时解密它。
【讨论】:
我认为您正在寻找柱式变压器。您可以在 Hibernate 参考中找到如何执行此操作:
希望对你有帮助!
【讨论】:
您可以使用jasypt。它有一个 Hibernate 集成,允许您在保存时加密属性(并在加载时解密)。
【讨论】: