【问题标题】:Storing email addresses anonymously匿名存储电子邮件地址
【发布时间】:2019-04-28 06:04:42
【问题描述】:

我运行一个用户可以登录的服务,但我永远不需要向他们发送电子邮件。我尽量使用户数据保持匿名。我对用户跟踪、销售数据等不感兴趣。我知道这个问题会有更简单的解决方案,例如“首先不要使用电子邮件地址”,但它们是一个很好的登录标识符,因为它们是 GUID .我的服务通过让用户验证地址的过程,这是我将发送的唯一电子邮件。

所以我有了匿名存储地址的想法。我的第一个想法是简单地存储每个地址的 SHA512 哈希值,但如果发生泄露——我相信我的安全性会阻止——从技术上讲,有人可以使用彩虹表来恢复至少一些地址。

要使用加盐散列,我需要一些方法来缩小潜在结果列表的范围,这样我就不会为每个用户计算每次登录的散列。那不会扩展。为此,我的想法是存储电子邮件 SHA512 的前 5 个字符。这当然不是一个独特的价值,但它给了我一个更小的潜在匹配池。从技术上讲,这一切都很好。

我担心的是这仍然容易受到彩虹表的影响。这 5 个字符足以查找可能的输入,并且攻击者已经知道只有看起来像电子邮件地址的输入才是有效的。考虑到未加盐哈希的第一部分和整个加盐哈希,他们仍然有足够的空间来确定电子邮件地址。

我是不是想多了?作为记录,在这种情况下我使用的是 pgsql 和 php,但这确实是一个实现细节。

更新:我仍然不确定我是否会继续这样做,但对于任何好奇的人来说,这里的彩虹表问题可以很容易地解决。与其对整个电子邮件进行散列并获取散列的前几个字符,不如使用电子邮件的前几个字符作为散列输入并存储整个散列。它达到了相同的效果,但彩虹表最多只会显示前几个字符。

【问题讨论】:

    标签: php postgresql hash cryptography


    【解决方案1】:

    对我来说,我认为是的。你看得太多了。 无论您的结构多么坚固,总有很小的破坏机会,因为没有人是完美的,也没有人可以编写脚本。 我认为你应该选择你认为最好的选择,然后坚持下去。

    有些事情最好听天由命。

    祝你好运

    【讨论】:

      【解决方案2】:

      我认为你想多了。您说您不需要向用户发送电子邮件,所以我的问题是您为什么需要存储电子邮件?您提到它是一个很好的 GUID,但如果您担心数据安全,让用户在电子邮件验证时定义用户名不是更容易吗?

      基本上,我描绘了电子邮件的短暂使用情况,它从未存储在数据库中,仅用于发送验证电子邮件。这将允许您向电子邮件发送一个自定义的一次性使用链接,这将使您的用户有机会创建一个自定义登录名,您可以根据您的数据库对其进行验证以确保它是唯一的。

      然后您可以安全地存储此唯一标识符,而不必担心它会导致电子邮件不安全。

      说了这么多,我认为没有任何必要。正如您所说,电子邮件是一个出色的 GUID。使它成为优秀 GUID 的原因在于它广为人知且可用。与发布明文电子邮件相关的风险比明文密码的风险要小得多,而且破坏性也小得多。我相信我们作为开发人员的时间最好是保护私有数据,而不是公共数据。

      【讨论】:

      • 是的,你可能是对的。我之前把所有的东西都放到了一个分支中,所以我仍然有代码。至于“为什么不使用用户名”的问题,只是为了减少“哦,该死,这个网站的用户名是什么”的场景。
      • @ThomMcGrath 这绝对是一个合理的担忧。这通常是我们使用电子邮件的原因。如果您没有像电子邮件这样的备份来恢复它,那么在这种情况下您就不走运了。我认为您可以将电子邮件存储在数据库中。如果您想偏执,请使用加盐哈希。任何破解它的人都会破坏你设置的任何安全措施。
      猜你喜欢
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-23
      • 1970-01-01
      • 2011-08-08
      • 2022-11-12
      • 2011-06-03
      相关资源
      最近更新 更多