什么是存储并仍然索引加密客户数据的最佳方式?

时间:2011-02-10 19:21:59

标签: database security encryption couchdb

我正在构建一个需要存储敏感信息的应用程序,这意味着数据在我的数据库中加密,以便有权访问数据库的黑客/员工无法解密敏感数据。 但是,它仍然需要搜索(在某个级别上)。

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

哪些最佳实践和方法可用于存储需要由授权人员查看,搜索和/或排序的敏感数据?

(我正在考虑从“body”中提取非stop words并在加密正文之前将它们按字段随机排列,然后将该字段提供给搜索索引器,我怀疑它提供了任何真实的安全性。)

9 个答案:

答案 0 :(得分:6)

更新:您希望查看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等)。

答案 1 :(得分:5)

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

我发现的最好的想法之一是RaulGarcía的这篇文章,http://blogs.msdn.com/b/raulga/archive/2006/03/11/549754.aspx

他建议使用MAC来创建可转位列。该解决方案适用于MS SQL Server,但可以应用于其他系统。

答案 2 :(得分:4)

您需要使用一种称为格式保留加密(搜索Wiki)的新类加密算法。

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

所以,考虑明智地使用它。不要依赖格式保留加密来获取需要保密期超过(比如说)5年的信息。

答案 3 :(得分:2)

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

答案 4 :(得分:2)

现实情况是,如果加密数据,您将无法从索引中受益。你需要接受这个。

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

你必须接受权衡。我希望有人带着一个证明我错了的wiz bang答案!

答案 5 :(得分:1)

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

以下是问题的人为但简单的例子: 想象一下,我们正在寻找商业电子邮件中的“儿童色情”。数据库是加密的,一切都很好。但是,如果搜索显示从John到Bill的电子邮件在搜索“儿童色情”时通过​​查找此电子邮件包含这两个词,那么实际内容就不再重要了 - 不应该讨论儿童色情内容电子邮件。

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

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

答案 6 :(得分:1)

存储加密的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 :(得分:1)

有些数据库支持加密索引。我所知道的(自从我为公司工作)就是UniVerse。

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

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

答案 8 :(得分:-1)

首先,如果黑客进入您的服务器,您可能比阅读加密数据库时遇到更大的问题。

加密会降低你的速度。这是加强弱链接的权衡:未加密的数据库。 KeePass(开源密码管理工具)预先说你不应该加密所有字段,因为它会减慢一切。

好消息是,你可以给自己足够的加密速度,让大多数人放慢速度,以便他们能够选择更环保的牧场。如果您使用AES加密,只是不要使迭代计数天文数字,并且您的应用程序的响应将是可接受的。