Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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 在不更改应用程序代码的情况下提高针对加密表的查询的性能_Java_Oracle_Oracle10g_Oracle11g_Database Performance - Fatal编程技术网

Java 在不更改应用程序代码的情况下提高针对加密表的查询的性能

Java 在不更改应用程序代码的情况下提高针对加密表的查询的性能,java,oracle,oracle10g,oracle11g,database-performance,Java,Oracle,Oracle10g,Oracle11g,Database Performance,我已经用Oracle和Java标记了这个问题,因为Oracle和Java解决方案都可以解决这个问题 我是Oracle security的新手,遇到以下问题需要解决。我在互联网上做了一些研究,但到目前为止我运气不好。起初,我认为Oracle-TDE可能对我的问题有所帮助,但在这里:TDE似乎不能保护数据免受DBA的影响,这是一个不容容忍的问题 问题是: 我有一张包含数百万条记录的表格。我有一个Java应用程序,它根据表中的一列(表的主键列)使用相等或范围条件查询该表。主键列包含敏感数据,因此已被加

我已经用Oracle和Java标记了这个问题,因为Oracle和Java解决方案都可以解决这个问题

我是Oracle security的新手,遇到以下问题需要解决。我在互联网上做了一些研究,但到目前为止我运气不好。起初,我认为
Oracle-TDE
可能对我的问题有所帮助,但在这里:
TDE
似乎不能保护数据免受
DBA
的影响,这是一个不容容忍的问题

问题是:

我有一张包含数百万条记录的表格。我有一个Java应用程序,它根据表中的一列(表的主键列)使用相等或范围条件查询该表。主键列包含敏感数据,因此已被加密。因此,使用来自应用程序的正常(即解密)值查询数据不能使用主键的唯一索引访问路径。我需要在不更改应用程序代码的情况下提高查询的性能(如果需要,可以修改应用程序配置,但不能修改代码)。只要该列保持加密,就可以在数据库端执行任何必要的更改

Oracle人员请:您建议如何解决此问题?如何在解密的列值上创建索引,并以某种方式强制Oracle使用此索引?如何使用诸如哈希分区之类的分区?风景怎么样?有什么解决办法吗

Java人士请:我自己有一个非常模糊的想法,就是在两者之间(即数据库和应用程序之间)创建一个单独的应用程序,作为代理接收来自应用程序的查询,并用加密值替换解密值,然后将其发送到数据库,然后它接收响应并将结果返回给应用程序。代理的行为应该类似于数据库,这样应用程序就可以仅通过更改配置文件中的连接字符串来连接到它。这样行吗?怎么做


提前感谢您的帮助

如何在解密的列值上创建索引,并以某种方式强制Oracle使用此索引? 也许您可以创建一个基于函数的索引,在其中索引解密的值

create index ix1 on tablename (decryptfunction(pk1));
它使用相等或范围条件对表中的列(表的主键列)查询此表

要找到一个特定的值,它非常简单-您可以以任何方式存储加密的数据-即使是作为散列,仍然可以使用索引检索特定的值。但根据我在其他地方的评论,如果没有以下两项,您就无法进行范围查询:


  • 解密表中的每一行

  • 使用可以在几秒钟内破解的算法
使用链表(或相关表)来定义顺序,而不是使用具有内在顺序的算法,将强制对更大的值集进行暴力检查——但这远不如正确加密的值安全


无论你是使用Oracle、Java还是纸笔,这都无关紧要。使用量子计算可能是可行的-但如果您负担不起确保应用程序的安全性/请专家密码专家提供好的建议,那么您肯定负担不起。

但这会将未加密的值存储在索引中。@symcbean这是真的。但这是其中之一。如果索引无法存储解密后的值,则无法对加密列执行索引范围扫描。但是索引数据可以被普通用户访问吗?如果我根据解密的值创建一个基于函数的索引,DBA是否可以访问索引内容?@Reza我不确定,但想知道,我在上面发布了一个问题。请看symcbean对另一个答案的评论。函数本身将向DBA公开;因此,价值观!看起来您是非常糟糕的数据库设计实践的受害者。主密钥应该是无意义的,并且它是为了保护而加密的,并且需要进行范围扫描,这表明在这种情况下它不是。我知道这并没有直接的帮助,但是如果你提出的解决方案性能差或者是一个可怕的黑客攻击,那么至少你可以指出这个问题作为辩护——对于一个基础设计实践差的问题,很少有一个优雅的解决方案。你能给我们一个你目前在表上运行的那种查询的示例吗?你能确认查询是按照“decrypt_function(encrypted_primary_key_column)=‘unencrypted_value_from_java’”的思路进行的吗?在我意识到在不损害dba私钥的情况下进行范围搜索是不可能的(除非使用保序加密算法)@David Aldridge认为主键应该是无意义的,这是一个值得讨论的话题。自然主键与代理主键。但我同意加密自然主密钥不是一个好的选择。给我一个教训:如果你使用自然主键,永远不要使用其中可能现在或将来被认为敏感的数据。任何“保序算法”都很容易用蛮力搜索破解(因为实际上你只需要二进制搜索来解码值)。“解密表中的每一行”:由于我不打算在应用程序内部执行此操作,也许基于未加密值的函数索引将按照另一个答案的建议执行此操作。我在对答案的评论中留下了这个问题:基于函数的索引会向包括DBA在内的用户显示值吗?如何创建这样一个函数而不让DBA访问密钥?