即使结果太少的查询被拒绝,也会侵犯隐私

信息安全 隐私 数据库
2021-08-15 12:31:26

我正在阅读一本计算安全书籍1,并看到一个关于数据库安全和隐私的问题。我无法完全弄清楚答案,所以我想我会在这里问。

确保隐私的一种方法是小结果拒绝,其中系统拒绝(不返回任何结果)任何查询,其结果来自少量记录,例如五个记录。展示如何仅使用从六条记录派生的查询来获取敏感数据。
强调添加

1 摘自计算安全性 作者:Charles P. Pfleeger、Shari Lawrence Pfleeger

如果有人可以帮助我回答,我将不胜感激。

3个回答

我认为这本书的意思是,如果你能想出一个只有几个结果的特定查询,你就可以在数据库中识别一个特定的目标。

例如,如果汽车经销商有一个客户数据库,并且他们将数据库“匿名化”以仅包含邮政编码、品牌、型号、年份、颜色和薪水,那么如果您知道邻居买了车,您就可以找到他们的薪水从那个经销商那里。

例如,您可以运行一个查询来选择您的邮政编码中拥有一辆 Green 2012 Chevy Volt 的所有人的薪水。如果您只有少数记录显示工资为 20K、30K、40K 和 300K,并且您知道您的邻居是一位成功的律师,您可以猜到他有 300K 的工资。

但是如果系统拒绝显示少于 100 个的结果,就很难找到这样一个结果集的目标。

简单的回答:

如果允许任何 SQL 查询,您也可以通过在最后执行类似 UNION SELECT myKnownRecord 的操作来人为地增加记录数。

更一般的答案:

此问题是称为去匿名化的更大策略系列的一部分。当其他方法(如 k-匿名强制、聚合、舍入和模糊或粗化数据)不起作用时,避免意外披露的方法之一是抑制小组的结果。

这种限制导致小范围查询的方法不能普遍适用的最大原因是,即使您不查看少于 5 个条目的结果,也有许多其他方法可以全面了解正在发生的事情。

假设我们有不同的标准 a、b 和 c。集合 A 是符合条件 a 的所有记录的集合,集合 A ∩ B 是符合条件 a 和 b 的所有记录的集合(对应 SQL JOIN 或类似操作)等。

假设 A ∩ B ∩ C 是一个足够小的集合来识别我们目标的记录(A ∩ B ∩ C 少于五个元素)。但是,最低记录标准限制了我们直接查看 A ∩ B ∩ C。但是,我们可以查看 A ∩ B、A ∩ C 和 A ∩ B,然后手动将其中两个进行并集得到并集我们想要 A ∩ B ∩ C。但是,这是假设您想要的结果是唯一的。如果记录不是唯一的(比如它们是字母等级、收入类别、是/否答案或基于返回记录的平均值),则您无法进行手动连接,我想不出一种通用的方法来得到准确的值。

有时也可以使用联合(外部连接)来破坏这种保护策略。如果您知道您的目标是集合 A 的少数成员之一(可能是因为 A 的结果被隐藏了),我们可以查看 AUC 的汇总结果,任何接近 0% 或 100% 的结果都将适用于我们在 A 中的目标。

绕过这种保护的另一种方法是使用其他结果减去我们想要的结果。如果我们知道 160 人中有 120 人在 A 组中有及格,157 人中有 120 人在 A ∩ B 中有及格,那么即使 A ∩ B'(A 而不是 B)由于太少而被隐藏结果我们已经知道该组中没有人通过。如果我们避免披露每组中有多少条目,通常可以避免这种情况,方法是积极四舍五入百分比,或将百分比分组(“< 5%”或 3% 而不是 3.1%)。

举个例子(根据国家教育统计中心提供的例子修改),假设所学校披露,2010 年只有一名美国印第安人/阿拉斯加原住民男性学生入学。如果学校披露了该人口统计的毕业率,则个人的隐私受到损害。如果可以使用互补的群体来全面了解学生,例如美洲印第安人/阿拉斯加原住民的毕业率为 0%,或者所有其他人口统计数据总计高达 100% 的毕业生,学生的隐私也可能受到侵犯。

为了提供背景信息,卡内基梅隆大学的 L. Sweeney 进行了一项研究,得出的结论是:“人们发现,少数特征的组合通常会在人群中组合以唯一或几乎唯一地识别某些个体。显然,包含有关这些个体的此类信息的发布数据不应该被认为是匿名的。然而,健康和其他个人特定数据以这种形式公开可用。以下是仅使用三个信息领域的一些令人惊讶的结果,尽管典型的数据发布包含更多领域......即使在县级, {县、性别、出生日期}可能唯一标识 18% 的美国人口。一般来说,唯一标识一个人需要很少的特征。已经证明了类似的个人身份识别和去匿名化用于天真匿名的信用卡交易数据库。因此,即使是“所有具有此性别、出生日期和地理区域的记录”或“最近访问这四家商店并花费约 50 美元的人”这样简单的查询也可能严重损害隐私。由于出生日期和城市等这类记录可以结合起来对数据进行去匿名化,因此编写了 HIPAA、FERPA 和类似标准来严格限制任何形式的此类信息的披露。

总之,正如CMU 的 Anupam Datta 所说,“幼稚的匿名化机制不起作用。”

仅通过 SQL 查询选择它,您可以查看对此问题的建议两个答案或多或少相等(JOIN,当未指定其类型时,无论如何默认为INNER JOIN大多数RDBMS )。

然而,这是用最少的记录产生结果的非常低效的方式。更容易但也更快的是,在前端生成代码中显示结果之前检查所需的记录数量,然后决定是列出匹配的记录,还是显示不公开的错误消息。

这更容易,因为您不必更改现有 SQL 查询来适应这一新要求,更快,因为没有内部链接到聚合结果集,而且更方便,因为您需要在前面处理这两种情况- 无论如何都要生成代码。

基本上,您所要做的就是在查询返回少于n条记录时显示相同(或相似)的消息,就像以前使用空结果集一样。

与语言无关的示例:

query.run;
if (query.recordcount >= 6) {
  display_results(query);
} else {
  error(minimum_not_reached);
}

替换:

query.run;
if (query.recordcount > 0) {
  display_results(query);
} else {
  error(no_results);
}

返回的错误消息当然不应该透露最低要求的记录,并且可能最好保持minimum_not_reached等于no_results. 如果您正在修改现有代码,那么发生这种情况也更方便,因为它几乎不需要任何更改(query.recordcount > 0to query.recordcount > 5)。

根据使用的 RDBMS,这也可以通过存储过程来实现;)