java - 使用 Hibernate 查询 SQL Server 2005 加密列的 Web 应用程序

标签 java hibernate jpa sql-server-2005 encryption

我们正在使用 Spring 3.1.2 和 Hibernate 4.1.7 以及数据库 SQL Server 2005 开发一个网络应用程序。

在一个表上,我们有一个加密的列,我们需要执行一些查询,例如,这个:

OPEN SYMMETRIC KEY PasswordFieldSymmetricKey
DECRYPTION BY PASSWORD = 'myPassword'

SELECT id, 
       plain,
       cipher, 
       CONVERT(varchar(50),
       DecryptByKey(cipher)) AS 'Decrypted'
FROM TS_OWN.cryptest;

GO
CLOSE SYMMETRIC KEY PasswordFieldSymmetricKey 

作为解决方案,someone建议创建一个管理解密的 View ,但我们需要任何人都不能看到解密的数据,当然,例如 DBA 可以查询该 View 。

同时,我们不想在 Java 端执行解密,因为由于性能原因需要数据库引擎执行一些繁重的聚合逻辑。

一种可能的解决方案是创建一个 View ,该 View 执行解密、聚合,然后再次加密结果,在 Java 端对聚合值执行解密。

有人知道其他选择吗?

谢谢大家 卢卡

最佳答案

从服务器端的角度来看,最透明的解决方案是使用Jasypt。 .这个库带有几个用于加密文本/密码字段的 Hibernate 用户类型。

如引用文档中所述,存在局限性:

But encryption sets a limitation on your Hibernate usage: security standards establish that two different encryption operations on the same data should not return the same value (due to the use of a random salt). Because of this, none of the fields that are set to be encrypted when persisted can be a part of a WHERE clause in your search queries for the entity they belong to.

虽然您的 HQL/SQL 查询会隐藏解密的复杂性,但您不会获得与特定数据库解密函数相同的性能。

使用数据库解密函数性能更好,但是您所有的查询都将嵌入到 View 中,这将显着改变您使用 Hibernate 的方式。

你可以映射 entities to views相反,但您必须注意 DML 语句(一些数据库提供 updatable views ,其他数据库为您提供物化 View ,或者您可能会使用 INSTEAD OF 触发器)。

OPEN/CLOSE SYMETRIC 的一种可能解决方案是使用您自己的@Decrypt 注释并添加一个方面以在事务开始之后和结束之前插入这些方面。这将起作用,因为 sql session /连接绑定(bind)到当前事务/线程。

关于java - 使用 Hibernate 查询 SQL Server 2005 加密列的 Web 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16670587/

相关文章:

java - JPA 无法序列化

Java 枚举、JPA 和 Postgres 枚举 - 如何让它们一起工作?

java - 我如何模拟 GoogleCredential 以测试我的业务逻辑

java - spring Kafka ConsumerFactory bean 未找到

java - Google Webmaster Tools API 能否用于自动修复 URL Page Not Found 错误?

java - java中如何访问空数组

java - Hibernate 和 Raw JDBC 应用程序的混合正在锁定

java - 当存在ManyToOne关系时如何删除子记录?

java - ORA-00904 JPA EclipseLink 2.1 标识符无效

java - com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException : Unknown column 'topic_id' in 'field list'