散列电子邮件地址以符合 GDPR

信息安全 哈希 隐私 匿名 国内生产总值
2021-08-21 10:49:08

更新

我们有一个非常独特的场景:我们有几个旧的用户帐户数据库。如果用户愿意,我们希望新系统能够将这些旧帐户连接到新系统上的新帐户。

例如,在 System X 上,您有一个旧帐户,有一个旧的(比方说)RPG 角色。在系统 Y 上,您有另一个旧帐户,上面有另一个 RPG 角色。

在我们的新系统上,使用他们的新帐户,我们希望我们的用户能够搜索这些旧数据库并认领他们的旧 RPG 角色。(我们的用户也想要这个功能。)

我们希望将用户的旧帐户 PII 保留在我们的数据库中,其唯一目的是允许他们重新连接新帐户的旧帐户。这将使他们受益并且是一个很酷的功能,但根据 GDPR 和我们的隐私政策,我们最终需要从我们的数据库中删除这个旧的 PII。

但是 - 如果我们以不可逆的方式存储这个旧 PII 会怎样。即,只有拥有该信息的人才能得到肯定匹配。

我不是安全专家,但我知道简单的散列(例如 MD5)太容易破解(委婉地说),并且(技术上)不需要“附加信息”(即密钥) .

MD5 的好处是它很快(从某种意义上说它是确定性的),这意味着我们可以非常快速地扫描一个包含 100,000 行的数据库来寻找匹配项。

如果 MD5(和 SHA)被认为不安全到毫无意义的地步,我们还能做些什么来扫描数据库以寻找匹配项?我猜想现代散列,比如 bcrypt,会因为这个原因而设计得很慢,并且考虑到它不是确定性的,意味着它不适合。

如果我们将 PII 的多个方面合并到一个字段中(例如 FirstnameLastnameEmailDOB),然后对其进行散列处理,那么它基本上会变得很咸。这是一个愚蠢的解决方案吗?

3个回答

MD5 或 SHA 不是问题。哈希可用于假名化。问题是哈希需要加盐(或胡椒粉),以便其他来源的数据无法用于识别此人。

我的电子邮件在任何地方都是一样的。它的哈希值也是一样的。所以这意味着,在这种情况下,哈希和我的电子邮件成为同义词。就像用户名和一个人的合法姓名(如果配对)一样。如果在这种情况下使用哈希,就 GDPR 而言,您实际上一无所获。

在不知道附加值的情况下,用盐(或胡椒)进行散列使得去匿名化几乎是不可能的。在这种情况下,盐(或胡椒)几乎成为了象征。

与往常一样,请咨询您的 DPO。

实际上,化名是混淆某人的 PII/NPI 的任何方法,因此无法合理地追溯到某个特定的个人。GDPR 并不一定规定您需要使用哪种散列算法才能符合其标准,老实说 - 最好不要,因为如果您考虑这样一个事实,即如果每个人都使用完全相同的方法混淆,你正在创造一个巨大的单点故障。您最好的选择(如上所述)是使用某种形式的带有盐的标记化,为您的算法添加额外的随机性,使其不易被暴力破解。

散列电子邮件的问题在于它们通常很短且易于暴力破解。

如果您使用盐,根据定义,它是一个公共“密钥”,因此您无需在保护方面添加任何内容。由于 GDPR 包括您自己无法追踪您的客户,因此您是这里的被告和攻击者,因此任何胡椒或密码对您自己都没有多大用处。

真正的问题是蛮力。我不是安全专家,但我们目前正在考虑解决与您的问题类似的问题:对于每个用户电子邮件,应用哈希算法 N 次,其中 N 是 Min 和 Max 之间的随机数。在您的数据库中查找时,获取用户提供的电子邮件并将其哈希最小时间,然后查找,然后再次哈希,然后查找等,直到您找到匹配项或达到最大时间。

为每个数据库条目设置 N 变化的好处是,暴力攻击需要尝试对他们尝试的每个组合进行哈希 Max-times,而如果你有组合,你很可能只在 ( Max-Min)/2 哈希迭代。所以平均而言,你让攻击者的生活比你的更难。这是假设您的数据库查找比每次散列迭代更快。

一些进一步的思考:

  1. 使用耗时的散列算法
  2. 使用好盐(长且随机)
  3. 考虑为每次迭代改变盐: salt(n) = f(salt(n-1))
  4. 考虑让盐在每次迭代之间演变: salt(n) = f(salt(n-1), hash(n-1))
  5. 顺便说一句,不要存储N