【问题标题】:What's the best way to store and yet still index encrypted customer data? [closed]存储并仍然索引加密客户数据的最佳方式是什么? [关闭]
【发布时间】:2011-06-25 02:23:03
【问题描述】:

我正在构建一个需要存储敏感信息的应用程序,这意味着我的数据库中的数据已加密,因此有权访问数据库的黑客/员工无法破译敏感数据。 但是,它仍然需要是可搜索的(在一定程度上)。

我了解可能必须做出某些妥协。例如,我愿意保留一些未加密的数据属性,以便在必要时使它们可索引,但“主体”必须加密

对于存储需要授权人员查看、搜索和/或排序的敏感数据,有哪些最佳做法和方法?

(我正在考虑从“正文”中提取非 stop words 并在加密正文之前将它们以随机顺序放在一个字段中,然后将该字段提供给搜索索引器,我怀疑它是否提供任何真正的安全性。 )

【问题讨论】:

  • 嗯,这很难 - 您需要仅在特定条件下自动解密数据库
  • @Piskvor,没有解密整个数据库会有点违背目的。需要的是一个加密信息的数据库。就像 docs.google.com 一样,它存储了我们所有加密的文档,但仍然可以搜索。

标签: database security encryption couchdb


【解决方案1】:

更新:您需要查看CipherSweet,而不是滚动您自己的设计。它照顾了很多subtle security details,并有一个straightforward security argument


哈希函数不是这里的解决方案。正如公认的答案所暗示的那样,indexing encrypted data 需要一个由 MAC 促进的“盲索引”。

假设您正在加密社会安全号码。当您将它们插入数据库时​​,您可能会执行以下操作:

$ssn_encrypted = \Defuse\Crypto\Crypto::encrypt($ssn, $our_encryption_key);
$ssn_blind_idx = \hash_hmac('sha512', $ssn, $our_search_key);

然后将这两个值存储在数据库中。当您需要根据 SSN 输入快速获取一个值时,您可以重新计算 HMAC 并根据它进行搜索。

数据库永远不会看到 SSN,并且永远不应将您的加密密钥签入源代码控制(SVN、git 等)。

【讨论】:

  • 当我意识到$our_search_key 实际上是一个加密密钥时,这对我来说更有意义,即$our_search_encryption_key
  • 这是一个加密密钥,但不是加密密钥。它只是用于身份验证,使索引对任何不拥有它的人真正视而不见。
  • @ScottArciszewski 部分字符串匹配怎么样?当您需要匹配部分字符串时,哪些是加密的?在这种情况下,DB 列将存储完整字符串的哈希值,但如何匹配该行,只有部分搜索字符串? ..'WHERE blind_idx LIKE %search_string%' 在这里不起作用....
  • 部分字符串搜索与加密字段存储不兼容,给定已知安全的加密模式。
  • @ScottArciszewski 我们可以存储 ngram 的哈希值吗? (我不确定拥有许多 ngram 的哈希值会如何影响安全性。)
【解决方案2】:

我目前正在寻找解决同样问题的方法。

我发现的最好的想法之一是 Raul García 的这篇文章,https://docs.microsoft.com/en-us/archive/blogs/raulga/indexing-encrypted-data

他建议使用MAC 创建一个可索引的列。该解决方案适用于 MS SQL Server,但也可以应用于其他系统。

【讨论】:

    【解决方案3】:

    您需要使用一类新的加密算法,称为 Format Preserving Encryption(搜索 Wiki)。

    我会明智地临时使用这些算法,因为它们对于文献来说相对较新,并且您等待算法在(比如说)十年前进行密码分析是一个经验法则你可以将它用于严肃的目的。我也不确定这种加密格式是否有任何标准。只有 2010 年提交的标准草案。http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/ffx/ffx-spec.pdf

    因此,请考虑明智地使用它。对于需要超过(例如)5 年保密期限的信息,不要依赖格式保留加密。

    【讨论】:

      【解决方案4】:

      现实情况是,如果您加密数据,您将不会从索引中受益。你需要接受这一点。

      如果需要索引,则通过删除 DBA 帐户上这些列的权限来保护数据。只有应用程序帐户才能查询这些列。安全性在于有限的访问而不是加密。

      你必须接受权衡。我希望有人进来一个神奇的答案,证明我错了!

      【讨论】:

      • +1。 Erangel 的链接非常好。但是请记住:这是一篇 MSDN 博客文章,探索了一个可能的想法,Dan 想要可靠的工具或技术用于生产,没有停机或数据丢失的风险。
      • 请注意,好吧,更像是一个插件,但我们的 UniVerse 数据库确实支持加密的列、表、主键甚至索引(“这意味着,除此之外,您的查询仍然可以有效执行基于索引的相等、有序或范围比较。")
      • @DanMcGrath,他们是怎么做到的?使用了什么流程?
      • 如果你搜索它,我认为他们在某处拥有专利。除此之外,我认为我不能谈论实现,因为它是专有软件。
      【解决方案5】:

      获取要搜索的属性并通过单向哈希(MD5、SHA1)运行它们,将结果存储为单独的列并为这些列建立索引。然后当你需要查询一个值时,通过相同的哈希运行输入(未加密的)值并搜索哈希值。

      【讨论】:

      • 假设全文搜索(这是最常见的),简单的字典攻击会使数据“不再加密”。因此,这种方法实际上几乎不比简单地索引明文更好。
      • 自我回答以来,该问题已被大量编辑。当时还没有提到全文搜索。
      • 即使是 half 文本搜索,也会泄露该文档的一半。当然,搜索词必须基于文档的内容,这意味着我们正在泄露有关文档的信息。
      • 基于一个或多个加密的特定列的平等搜索很容易,如我的回答中所述。其他任何事情,例如基于范围或加密字段的全文搜索都是一个完全不同的问题。
      • 我的意思是您所说的一个或多个特定属性需要加密而不仅仅是散列,因为散列不能保证它们的保密性
      【解决方案6】:

      存储加密的 blob,但创建单独的索引表,这些索引表使用加密关系绑定到 blob。例如,下表可以存储您的 blob:

      blob(ID,SHA(secret-seed,data))
      

      并且索引可能与 blob 相关:

      word(SHA(secret-seed,blob-ID),value)
      

      现在,当您查询一些 blob 时,您会这样做:

      select blob join word on SHA(secret-seed,ID) = word-ID where query IN value
      

      您甚至可以为键和实际 blob 数据使用不同的种子。

      【讨论】:

        【解决方案7】:

        您的方案中的主要问题是索引/搜索的加密和可用性是矛盾的参数。

        这是一个人为但简单的问题示例: 想象一下,我们正在商业电子邮件中寻找“儿童色情”。数据库是加密的,一切都很好。但是,如果在搜索“儿童色情”时找到这封电子邮件,发现约翰给比尔的电子邮件包含这两个词,那么实际内容就不再重要了——儿童色情不应该在电子邮件。

        因此,如果数据库与索引一起泄漏,对词集的智能分析可以揭示大量信息。例如,发现软件供应商公司 50% 的公司邮件包含“webos”一词可以揭示 [可能是秘密] 事实,即该公司为 webos 开发软件。

        现在您明白了,加密在您的情况下的用处有限。更强的数据库整体安全性可能比加密更重要。

        【讨论】:

        • 我不认为加密的数据库可以使用未加密的文本进行搜索。目的是任何想要进行搜索的人都需要知道加密和密钥。困难在于,如果要允许有效搜索例如以“chil”开头的条目,那么数据库必须有一些方法来区分以“chil”开头的条目和以其他字符开头的条目,而不必解密所有条目。这只能通过对索引本身进行加密来真正做到;数据库引擎比客户端更容易做到这一点。
        • @Eugene,你的观点是非论点。显然,没有 key 的搜索应该会给你 0 个结果。搜索输入不再是简单的文本输入本身,而是键和文本输入的二重奏。
        【解决方案8】:

        有些数据库确实支持加密索引。我认识的(因为我在公司工作)是 UniVerse。

        查看安全手册(1)“自动数据加密”部分。也许它会给你一些想法。

        (1):http://docs.rocketsoftware.com,搜索“UniVerse 安全功能”

        【讨论】:

        • 关于这个线程,你在说那个 pdf 的哪一章?
        • 你知道加密索引安全性的独立评估吗?直观地说,除了严格相等索引之外的任何东西似乎都必须不可避免地损害安全性。如果它只是严格相等的索引,我猜想这个问题的其他答案中概述的解决方案是优越的,如果没有其他原因,它们是具体和具体的。
        • Rocket Software 文档站点非常不友好——没有指向特定文档的好链接供其他人共享。我找到了一个版本的 UniVerse 安全功能 PDF,在该 401 页文档的第 234 页,在“加密索引”部分中,似乎索引数据本身(“索引文件”)已加密,但仅作为“ UniVerse 还确保可以像使用明文索引一样使用加密索引,这意味着您的查询仍然可以基于索引执行有效的相等、有序或范围比较。”。
        • 第 235 页的此注释似乎也暗示 UniVerse 的“加密索引”不是 加密数据的索引:“注意:您可以加密虚拟字段索引,但是虚拟字段本身不能加密。如果文件中的任何数据字段被加密,则应分析所有虚拟字段索引,并直接加密任何涉及加密数据字段的索引。否则,您将面临将加密数据暴露在明文中的风险通过未加密的虚拟字段索引文件发送文本。”
        • @KennyEvitt 我已经有好几年没在 Rocket 工作了,所以我建议在这里给他们发​​消息问你的一些问题。
        猜你喜欢
        • 2021-05-06
        • 2021-12-05
        • 1970-01-01
        • 2012-10-03
        • 1970-01-01
        • 1970-01-01
        • 2012-04-08
        • 2022-01-25
        • 1970-01-01
        相关资源
        最近更新 更多