【发布时间】:2019-04-28 06:04:42
【问题描述】:
我运行一个用户可以登录的服务,但我永远不需要向他们发送电子邮件。我尽量使用户数据保持匿名。我对用户跟踪、销售数据等不感兴趣。我知道这个问题会有更简单的解决方案,例如“首先不要使用电子邮件地址”,但它们是一个很好的登录标识符,因为它们是 GUID .我的服务通过让用户验证地址的过程,这是我将发送的唯一电子邮件。
所以我有了匿名存储地址的想法。我的第一个想法是简单地存储每个地址的 SHA512 哈希值,但如果发生泄露——我相信我的安全性会阻止——从技术上讲,有人可以使用彩虹表来恢复至少一些地址。
要使用加盐散列,我需要一些方法来缩小潜在结果列表的范围,这样我就不会为每个用户计算每次登录的散列。那不会扩展。为此,我的想法是存储电子邮件 SHA512 的前 5 个字符。这当然不是一个独特的价值,但它给了我一个更小的潜在匹配池。从技术上讲,这一切都很好。
我担心的是这仍然容易受到彩虹表的影响。这 5 个字符足以查找可能的输入,并且攻击者已经知道只有看起来像电子邮件地址的输入才是有效的。考虑到未加盐哈希的第一部分和整个加盐哈希,他们仍然有足够的空间来确定电子邮件地址。
我是不是想多了?作为记录,在这种情况下我使用的是 pgsql 和 php,但这确实是一个实现细节。
更新:我仍然不确定我是否会继续这样做,但对于任何好奇的人来说,这里的彩虹表问题可以很容易地解决。与其对整个电子邮件进行散列并获取散列的前几个字符,不如使用电子邮件的前几个字符作为散列输入并存储整个散列。它达到了相同的效果,但彩虹表最多只会显示前几个字符。
【问题讨论】:
标签: php postgresql hash cryptography