快速搜索加密数据?

时间:2014-05-07 21:46:01

标签: php sql-server performance search encryption

我需要加密应用程序数据库中的个人身份信息(PII)数据。该应用程序在系统中使用智能搜索,使用声音,名称根和部分单词搜索来快速查找名称和地址。

如果我们对这些字段(在应用程序层加密的PII数据)进行加密,搜索将受到记录量的影响,因为我们无法以正常方式依赖SQL和搜索引擎(在应用程序中) )将切换到读取所有值,解密它们并进行搜索。

有没有简单的解决方法,所以我们可以随时加密PII数据,并为我们的用户群提供快速搜索功能?

我们正在使用PHP Web / App层(Zend Server和SQL Server DB)。该应用程序目前不使用Lucene等技术。

由于

干杯

3 个答案:

答案 0 :(得分:4)

加密数据也使它看起来像随机比特串一样。这排除了通过索引进行快捷方式搜索的任何操作。

对于某些加密数据,例如社会安全号码,您可以将数字的哈希值存储在单独的列中,然后索引此哈希字段并搜索哈希值。这显然有限,但在搜索名称中没有价值,如'ROB%'

如果您的数据库正确安全可能听起来不错,但如果坏人可以闯入并窃取您的服务器或备份,则很难实现。如果这是真正的要求(不仅仅是可协商的营销驱动项目),您将被迫遵守。

您可以协商以未加密的方式存储部分数据,例如姓氏的前3个字符或类似数据,以便您仍然可以使用有用的(如果不是完美的)索引。

ADDED

我应该补充一点,你可能会被允许散列名称字段的一部分,并搜索该哈希值 - 假设你不允许存储未加密的部分名称 - 你再次失去了用处,但它可能仍然会更好根本没有索引。

为了使这个散列变得有用,它不能被播种 - 即,所有记录必须基于相同的种子(或没有种子)进行散列,否则您将无法执行表扫描。

您还可以创建一个覆盖索引,当然仍然是加密的,但由于I / O和I&O的减少,表扫描可能会更快。需要记忆。

答案 1 :(得分:3)

我会尝试写这个,因为通常加密社区很难理解(我拒绝在这里插入双关语的冲动)。

我使用的一个特别适用于名称的解决方案是为您希望索引的内容创建索引表,并像姓氏一样快速搜索,然后仅加密这些索引列。

例如,您可以创建一个表,其中键列包含一个3个字母字符串中每个可能的字符组合A-Z的条目(并包含除第一个字符以外的所有字符的空格)。像这样:

A__
AA_
AAA
AAB
AAC
AAD
..
..
..
ZZY
ZZZ

然后,当您向数据库添加人员时,将其索引添加到第二列,该列只是人员ID的列表。

示例:在您的患者表中,您将拥有这样的史密斯条目:

231    Smith    John    A     1/1/2016   .... etc

并且此条目将被加密,可能是除了ID 231之外的所有列。然后,您可以将此人添加到索引表中:

SMH    [342, 2342, 562, 12]
SMI    [123, 175, 11, 231]

现在您加密第二列(ID列表)。因此,当您搜索姓氏时,您可以输入' smi'并快速检索以此字母组合开头的所有姓氏。如果你没有密钥,你只会看到一个密文。实际上,您可以在这样的表中创建两列,一列用于名字,另一列用于姓氏。

此方法与明文索引一样快,并使用一些相同的基本原则。您可以使用soundex('听起来像')通过构建一个表格,将所有可能的soundex模式作为左列,将person(患者?)ID作为另一列来执行相同的操作。通过创建多个这样的索引,您可以开发一种很好的方法来磨练您正在寻找的名称。

如果你愿意,你也可以扩展到更多的角色,但显然这会使你的桌子每个字母延长一个数量级以上。它确实具有使您的索引更具体(不总是您想要的)的优势。说实话,任何类型的直方图都可以使用他们的名字对人进行分类。我已经看到这与出生日期一起完成了。你需要搜索的任何东西。

这样的表存在一些漏洞,特别是因为某些存储区的条目数可能非常短,攻击者可能会确定哪些名称在系统中没有条目。但是,使用一种随机的盐'在索引列表中可以帮助解决这个问题。其他问题包括每次更新值时都需要不断更新所有索引。

但即使这样,这种方法也会创建一个超出静态数据的加密系统。静态数据仅保护您免受无法获得系统授权的攻击者的攻击,但该系统为DBA和其他可能需要在数据库中工作但不需要(或不需要)的人员提供了一层保护)查看其中包含的个人数据。他们只会看到密文。因此,实际需要/想要访问该信息的用户或系统需要额外的密钥。阿什利麦迪逊采用这种策略是明智的。

希望这有帮助。

答案 2 :(得分:1)

有时,"加密数据"真的意味着在静止时加密数据"。也就是说,您可以使用透明数据加密来保护数据库文件,备份等,但通过查询可以清楚地看到数据。了解这是否足以满足您尝试满足的任何规定,这将使您的工作变得更加轻松。