首页 > 解决方案 > 匿名存储电子邮件地址

问题描述

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

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

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

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

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

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

标签: phppostgresqlhashcryptography

解决方案


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

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

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

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


推荐阅读