4

我们正在使用带有数据库 SQL Server 2005 的 Spring 3.1.2 和 Hibernate 4.1.7 开发 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 端执行聚合值的解密。

有人知道替代品吗?

谢谢大家, 卢卡

4

1 回答 1

4

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

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

但是加密对您的 Hibernate 使用设置了限制:安全标准规定,对相同数据的两种不同加密操作不应返回相同的值(由于使用了随机盐)。因此,在持久化时设置为加密的任何字段都不能成为它们所属实体的搜索查询中的 WHERE 子句的一部分。

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

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

您可以改为将实体映射到视图,但您必须注意 DML 语句(一些 DB 提供可更新视图,其他数据库为您提供物化视图,或者您可能使用 INSTEAD OF 触发器)。

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

于 2014-09-30T08:26:26.050 回答