【问题标题】:DataBase encryption in HibernateHibernate 中的数据库加密
【发布时间】:2011-04-11 12:42:45
【问题描述】:

使用hibernate时如何加密数据库字段?

我们已经开发了一些客户正在使用该应用程序的产品一些客户正在询问数据库加密 是否有可能在不更改代码的情况下在应用程序级别加密数据。

请尽快给我建议。

【问题讨论】:

标签: java database hibernate


【解决方案1】:

试试这个:

在你的实体中添加一个属性:

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 注释调用它们。所以当你必须移植到另一个数据库时,你只需要在数据库本身中实现这些,鲍勃就是你的叔叔。
  • 恕我直言,这不是加密的工作方式。基本思想是只有访问数据库才能解密该值。那么,如果有一个内置或存储过程来实现这一点,那又有什么意义呢?我的意思是通常客户端应该负责加密和解密数据......
  • 该解决方案完美运行。但是这些信息是远程转换并发送回加密的,还是加密将在休眠端?(对java进程来说是本地的?)
【解决方案2】:

你可以像这样使用@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 时加密实体属性,并在您读取实体时解密它。

【讨论】:

    【解决方案3】:

    我认为您正在寻找柱式变压器。您可以在 Hibernate 参考中找到如何执行此操作:

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

    希望对你有帮助!

    【讨论】:

      【解决方案4】:

      您可以使用jasypt。它有一个 Hibernate 集成,允许您在保存时加密属性(并在加载时解密)。

      http://www.jasypt.org/hibernate.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 2011-08-17
        • 2014-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-19
        相关资源
        最近更新 更多