我们有一个拥有大量用户的网站,由于 PCI 合规性问题,我们必须加密存储他们的名称(我们使用河豚)。现在我们需要在管理面板中通过他们的名字有一个通配符搜索功能,我们不能以“查询中”的方式解密。
有什么通用的解决方案来解决这个问题?
我们有一个拥有大量用户的网站,由于 PCI 合规性问题,我们必须加密存储他们的名称(我们使用河豚)。现在我们需要在管理面板中通过他们的名字有一个通配符搜索功能,我们不能以“查询中”的方式解密。
有什么通用的解决方案来解决这个问题?
我可以想到两种可能的方法。
第一个作品名称本身不是秘密的,但与它们相关的数据是秘密的。您可以设置单独的搜索索引:
Name Record Number
---- -------------
John Q. Public 12345
Hector H. Suarez 54321
Katherine T. Carson 98712
搜索索引以找到相关的记录号。检索并解密该特定记录。
第二个是当名字本身是秘密的时候。基本上,将名称视为密码:使用加密安全散列对每个名称进行散列,例如 SHA-256。在这种情况下,您将无法使用 salt,因为它用于搜索。您可能还需要预处理搜索,因为“John Q. Public”和“John Q Public”(没有句号)将散列到非常不同的值。此搜索索引如下所示:
Hashed Name Record Number
----------- -------------
1A2BFF68C ... CAF4 12345
5820BAA5F ... 67FA 54321
2039F288A ... 9BC2 98712
对于每次搜索,您都会散列名称并查找该散列。再次检索和解密相应的记录。除非您准备为所有主要搜索可能性设置许多类似的索引,否则您不能进行部分名称搜索,例如“检索所有 Smiths”。
您使用诸如 Lucene 之类的索引系统,索引每个文档(已解密),并在此索引上进行搜索。
仔细阅读 PCI DSS 2.0 版中标题为“PCI DSS 应用信息”的 PCI-DSS 部分。
您应该从阅读本文中发现“PCI DSS 要求 3.3 和 3.4 仅适用于 PAN”。这可能是您不必加密 PAN 以外的数据的解决方法 - 这意味着名称可以以纯文本形式存储。
这不一定是最佳实践,但如果您绝对必须具有能够通过文本进行通配符搜索的功能,则需要考虑