如何使用动态数据屏蔽来保护列但仍允许在连接中使用它?

问题描述

这似乎是一个非常常见的用例。假设我们有想要保护的敏感 PII,例如 SSN。我们使用 SNowflake 中的动态数据屏蔽屏蔽该数据。现在我们有一位工程师正在编写数据转换,他们需要使用 SSN 连接两个表。他们没有查看 SSN 的权限,但他们可以查看两个表上的其他信息。我希望工程师能够加入这两个表,并查看所有组合的不安全数据,同时对工程师保密 SSN。我真的不知道为什么 SNowflake 不在幕后使用真实值进行连接,同时拒绝在结果中返回它们。有解决方法吗?

一个想法是让屏蔽策略返回初始值的哈希值。这有几个限制。首先,它在 Snowflake docs 中被明确警告。其次,它需要对所有值进行运行时散列,这似乎不必要地减慢了查询执行速度。第三,存在可能破坏连接的散列冲突问题。这可能会导致工程师花费数天时间来追踪代码中的错误,结果却发现数据集中的额外行是哈希冲突的结果。

另一种可能的解决方案是使用外部标记化提供程序 (docs)。我不太理解这个选项,但这似乎意味着我需要使用第三方服务存储实际值及其标记化形式,然后每次我想在一个询问。这似乎不太理想。我宁愿将解决方案包含在 SNowflake 中。

我很想听听您的想法,提前致谢。

解决方法

如果您关心数据库完整性并避免错误:不要使用 SSN 作为标识符。

SSN 可以是一个人的财产,但不要将其用作他们的主键。

正如美国社会保障局所说:

1990 年 OIG、HHS 的一项研究表明,45% 的公共和私人组织使用 SSN 不努力验证 SSN 的准确性。这导致从一个组织到另一个组织的数据传输可能不准确的真实可能性;不同组织之间数据的计算机匹配可能无效;无辜的人的隐私可能会受到无端侵犯,或者他们的福利或服务发生不当变化,甚至被误认并导致严重后果。

还有:

SSN 是政府和私营部门使用最广泛的单一记录标识符,对大多数美国人的生活产生广泛影响。然而,它本身并不是一个个人标识符,因为它缺乏对每个人的系统分配和验证一个人身份的方法。

相反,您可以为数据库中的每个人创建一个唯一的 ID,并使用该键进行连接。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...