Java 如何使用Hibernate加密数据以防止访问列值
我使用Hibernate开发了一个JavaWeb服务来连接数据库。用户将存储任何人都不应直接访问的数据,即使是从数据库中 是否有可能为每个用户生成加密/解密数据库中数据的密钥。如何在一组用户之间共享访问权限Java 如何使用Hibernate加密数据以防止访问列值,java,hibernate,encryption,Java,Hibernate,Encryption,我使用Hibernate开发了一个JavaWeb服务来连接数据库。用户将存储任何人都不应直接访问的数据,即使是从数据库中 是否有可能为每个用户生成加密/解密数据库中数据的密钥。如何在一组用户之间共享访问权限 如何使用Hibernate?至于通过Hibernate在数据库中存储加密内容,我建议您投入一些时间进行研究。它提出了一些选择: 使用JDBC over SSL代替普通的JDBC连接(应用程序和数据库之间没有流量嗅探) 与其加密数据库中的特定内容,不如使用类似于加密存储数据的硬盘驱动器的内容
如何使用Hibernate?至于通过Hibernate在数据库中存储加密内容,我建议您投入一些时间进行研究。它提出了一些选择:
- 使用JDBC over SSL代替普通的JDBC连接(应用程序和数据库之间没有流量嗅探)
- 与其加密数据库中的特定内容,不如使用类似于加密存储数据的硬盘驱动器的内容
- 使用自定义Hibernate
s动态加密/解密数据(即,您将使用UserType
而不是EncryptedString
)String
UserType
s动态加密/解密数据,我建议对提供此类类型的进行评估。透明加密/解密
如果您的数据库支持透明加密/解密,那么这可能是最好的选择
茉莉花
另一个选项是使用您可以使用的,它提供了多种Hibernate类型来加密/解密数据
使用@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将能够在您访问实体属性时对其进行加密,并在获取实体时对其进行解密。管理员也不应该访问数据(这意味着不知道用户存储的具体内容)。因此,我的建议是使用Jasypt?如果您能够承担并接受此解决方案的后果,那么可以使用Jasypt(或自定义
UserType
s)。