【发布时间】:2012-11-07 07:26:23
【问题描述】:
我已经用 Oracle 和 Java 标记了这个问题,因为 Oracle 和 Java 解决方案都可以解决这个问题。
我是 Oracle 安全的新手,我遇到了以下要解决的问题。我在互联网上做了一些研究,但到目前为止我没有运气。起初,我认为Oracle TDE 可能对我的问题有帮助,但在这里:Can Oracle TDE protect data from the DBA? 似乎TDE 不能保护数据免受DBA 的侵害,这是一个不能容忍的问题。
问题来了:
我有一个包含数百万条记录的表。我有一个 Java 应用程序,它使用相等或范围条件对表中的列进行查询,该列是表的主键列。主键列包含敏感数据,因此已经加密。因此,使用来自应用程序的正常(即解密)值查询数据不能使用主键的唯一索引访问路径。我需要在不更改应用程序代码的情况下提高查询的性能(如果需要,可以修改应用程序配置,但不能修改代码)。只要该列保持加密状态,就可以在数据库端进行任何必要的更改。
Oracle 人员:您对这个问题有什么建议?如何在解密的列值上创建索引并以某种方式强制 Oracle 使用该索引?如何使用诸如散列分区之类的分区?观点如何?任何,任何解决方案?
Java 人士请:我自己有一个非常模糊的想法,即在两者之间(即数据库和应用程序之间)创建一个单独的应用程序,它充当接收来自应用程序并用加密值替换解密值并将其发送给数据库,然后它接收响应并将结果返回给应用程序。代理应该像数据库一样运行,以便应用程序可以通过仅更改配置文件中的连接字符串来连接到它。这行得通吗?如何?
提前感谢您的所有帮助!
【问题讨论】:
-
看起来您是非常糟糕的数据库设计实践的受害者。主键应该是没有意义的,并且它被加密以保护并且受到范围扫描的事实表明它不是在这种情况下。我知道这并没有直接的帮助,但是如果您提出的解决方案性能不佳或者是一个可怕的黑客攻击,那么至少您可以在防御中指出这个问题——对于基本设计不佳的问题,很少有优雅的解决方案实践。
-
你能给我们一个你目前对表运行的查询的示例吗?您能否确认该查询按照“decrypt_function(encrypted_primary_key_column) = 'unencrypted_value_from_java”的方式执行了某些操作?
-
我本来打算写一些建议,然后才意识到没有办法在不损害 dba 的私钥的情况下进行范围搜索(除非使用顺序保留加密算法)
-
@David Aldridge 主键应该没有意义是一个有争议的话题。自然与代理主键。但我同意加密自然主键不是一个好的选择。我要吸取的教训:如果您使用自然主键,则永远不要使用其中现在或将来可能被认为是敏感的数据。
-
任何“顺序保持算法”都很容易通过暴力搜索破解(因为实际上你只需要二进制搜索来解码一个值)。
标签: java oracle oracle10g oracle11g database-performance