php - 匿名存储电子邮件地址
问题描述
我运行一个用户可以登录的服务,但我永远不需要向他们发送电子邮件。我尽量使用户数据保持匿名。我对用户跟踪、销售数据等不感兴趣。我知道这个问题会有更简单的解决方案,例如“首先不要使用电子邮件地址”,但它们是一个很好的登录标识符,因为它们是 GUID . 我的服务通过让用户验证地址的过程,这是我唯一发送的电子邮件。
所以我有了匿名存储地址的想法。我的第一个想法是简单地存储每个地址的 SHA512 哈希值,但如果发生泄露——我相信我的安全性会阻止——从技术上讲,有人可以使用彩虹表来恢复至少一些地址。
要使用加盐散列,我需要一些方法来缩小潜在结果列表的范围,这样我就不会为每个用户计算每次登录的散列。那不会扩展。为此,我的想法是存储电子邮件 SHA512 的前 5 个字符。这当然不是一个独特的价值,但它给了我一个更小的潜在匹配池。从技术上讲,这一切都很好。
不过我担心的是这仍然容易受到彩虹表的影响。这 5 个字符足以查找可能的输入,并且攻击者已经知道只有看起来像电子邮件地址的输入才是有效的。考虑到未加盐散列的第一部分和整个加盐散列,他们仍然有足够的空间来确定电子邮件地址。
不过我是不是想多了?作为记录,在这种情况下,我使用的是 pgsql 和 php,但这实际上是一个实现细节。
更新:我仍然不确定我是否要继续这样做,但对于任何好奇的人来说,这里的彩虹表问题可以很容易地解决。与其对整个电子邮件进行散列并获取散列的前几个字符,不如使用电子邮件的前几个字符作为散列输入并存储整个散列。它达到了相同的效果,但彩虹表最多只会显示前几个字符。
解决方案
我觉得你想多了。您说您不需要向用户发送电子邮件,所以我向您提出的问题是,您为什么需要存储电子邮件?您提到它是一个很好的 GUID,但是如果您担心数据安全性,让用户在电子邮件验证时定义用户名不是更容易吗?
基本上,我描绘了电子邮件的短暂使用情况,它从未存储在数据库中,仅用于发送验证电子邮件。这将允许您向电子邮件发送一个自定义的一次性使用链接,这将使您的用户有机会创建一个自定义登录名,您可以根据您的数据库对其进行验证以确保它是唯一的。
然后,您可以安全地存储此唯一标识符,而不必担心它会导致电子邮件不安全。
综上所述,我认为没有任何必要。正如您所说,电子邮件是一个出色的 GUID。使它成为优秀 GUID 的原因在于它广为人知且可用。与发布明文电子邮件相关的风险比明文密码的风险要少得多,破坏性也小得多。我相信我们作为开发人员的时间最好是保护私有数据,而不是公共数据。
推荐阅读
- vb.net - 我可以将 OledbCommand 的参数传递给其他 OledbCommand 吗?
- postgresql - 如何在openshift中连接到不同项目中的postgres数据库
- python - 语法错误:无法分配给函数调用
- javascript - 迁移服务器后,HTML 网站按预期停止工作
- react-native - React Native:不变违规:元素类型无效:预期的字符串或类/函数但得到:未定义
- java - 使用 java 代码发送邮件在少数网络上工作,而不是在少数网络上工作?
- python-3.x - 列表中的 Keras Model.fit X 与 ndarray 错误
- java - 如何在 Spring Boot 中使用 JCS(Rest api)
- android - 如何为 Switch Navigator 设置返回按钮
- c# - 从控制器动态更改 css