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

dan*_*dan 24 database security encryption couchdb

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

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

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

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

Sco*_*ski 6

更新:您需要查看CipherSweet而不是滚动自己的设计.它处理了许多微妙的安全细节,并具有直接的安全性论点.


散列函数不是解决方案.正如所接受的答案所暗示的那样,索引加密数据需要由MAC促成的"盲目索引".

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

$ssn_encrypted = \Defuse\Crypto\Crypto::encrypt($ssn, $our_encryption_key);
$ssn_blind_idx = \hash_hmac('sha512', $ssn, $our_search_key);
Run Code Online (Sandbox Code Playgroud)

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

数据库永远不会看到SSN,您的加密密钥永远不应该被检入源代码控制(SVN,git等).


小智 5

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

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

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