Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Hibernate查询SQL Server 2005加密列的Web应用程序_Java_Hibernate_Jpa_Sql Server 2005_Encryption - Fatal编程技术网

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

Java 使用Hibernate查询SQL Server 2005加密列的Web应用程序,java,hibernate,jpa,sql-server-2005,encryption,Java,Hibernate,Jpa,Sql Server 2005,Encryption,我们正在使用Spring3.1.2和Hibernate4.1.7以及数据库SQLServer2005开发一个web应用程序 在一个表上,我们有一个加密的列,我们需要执行一些查询,例如: OPEN SYMMETRIC KEY PasswordFieldSymmetricKey DECRYPTION BY PASSWORD = 'myPassword' SELECT id, plain, cipher, CONVERT(varchar(50),

我们正在使用Spring3.1.2和Hibernate4.1.7以及数据库SQLServer2005开发一个web应用程序

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

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 
作为一个解决方案,我们建议创建一个管理解密的视图,但我们需要没有人必须看到解密的数据,当然,例如DBA可以查询该视图

同时,我们不希望在java端执行解密,因为由于性能原因,数据库引擎可能会执行一些重聚合逻辑

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

有人知道其他选择吗

谢谢大家,,
Luca

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

如参考文件所述,存在以下限制:

但是加密对Hibernate的使用设置了一个限制:安全性 标准规定,在服务器上执行两种不同的加密操作 相同的数据不应返回相同的值(由于使用了随机变量 盐)。因此,所有设置为 持久化时加密可以是文件中WHERE子句的一部分 在查询中搜索它们所属的实体

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

使用数据库解密函数执行得更好,但是所有查询都将嵌入到视图中,这将极大地改变您使用Hibernate的方式

您可以改为映射,但您必须注意DML语句(一些DBs提供,其他DBs提供物化视图,或者您可以使用替代触发器)


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

是否绑定了本机sql qury会话。createSQLQuery(“您的查询”).list();也许我错了,而且肯定不擅长SQL Server,但是
开放对称密钥
似乎类似于命令/指令,而不是查询的一部分。此外,我们不想处理对象数组,我们想知道是否存在一个更优雅的解决方案来处理这种加密的COL,可能是通过hibernate。@Dolfiz您找到过优雅的解决方案吗?我一直在寻找一个使用SQL方言的hibernate解决方案,您对此有何看法?在查询之前添加任意sql,例如打开对称密钥blahblah,并将列映射到公式。但是我找不到向生成的sql添加任意sql的方法。SqlDialante不提供用于拦截查询语句的钩子,并且您希望在事务级别的作用域上这样做。检查我的最新答案。