【问题标题】:performance improvement of queries against encrypted table without changing the application code在不更改应用程序代码的情况下提高对加密表的查询性能
【发布时间】: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


【解决方案1】:

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

create index ix1 on tablename (decryptfunction(pk1));

【讨论】:

  • 但这会将未加密的值存储在索引中。
  • @symcbean 这是真的。但这是其中之一。如果索引无法存储解密值,则无法对加密列执行索引范围扫描。但是普通用户可以访问索引数据吗?
  • 如果我为解密的值创建一个基于函数的索引,DBA 可以访问索引内容吗?
  • @Reza 我不确定,但想知道,我在 SO 上发布了一个问题。 stackoverflow.com/questions/13469060/…
  • 请查看 symcbean 在其他答案上留下的评论。函数本身将暴露给 DBA;因此,价值观!
【解决方案2】:

使用相等或范围条件对表中的列进行查询,该列是表的主键列

要找到一个特定的值,它很简单——你可以以任何你喜欢的方式存储加密的数据——即使是作为哈希值,仍然可以使用索引来检索特定的值。但是根据我在其他地方的评论,没有任何一个都不能进行范围查询:

  • 解密表中的每一行

  • 使用可以在几秒钟内破解的算法。

使用链表(或相关表)来定义顺序而不是使用具有内在顺序的算法会强制对更大的一组值进行强力检查 - 但它远不如正确加密的值安全。

您使用 Oracle、Java 还是铅笔和纸都没关系。使用量子计算可能是可能的 - 但如果您无法确保应用程序的安全性/支付不起密码专家的好建议,那么您肯定无法负担得起。

【讨论】:

  • “解密表中的每一行”:由于我不打算在应用程序中执行此操作,因此未加密值的基于函数的索引可能会像其他答案所建议的那样完成工作.我在对该答案的评论中留下了这个问题:基于函数的索引是否会向包括 DBA 在内的用户显示这些值?
  • 如何在不让 DBA 访问密钥的情况下创建这样的函数?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-03
  • 2010-09-19
  • 2016-09-09
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多