Java 使用Hibernate查询SQL Server 2005加密列的Web应用程序
我们正在使用Spring3.1.2和Hibernate4.1.7以及数据库SQLServer2005开发一个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),
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不提供用于拦截查询语句的钩子,并且您希望在事务级别的作用域上这样做。检查我的最新答案。