身份验证中使用的散列 + 加盐电子邮件 - 好的还是坏的做法?

Hashing + salting emails used in authentication - good or bad practice?

电子邮件地址和用户名的散列 + 加盐不是正常的事情吗?就像在数据泄露中一样,您将无法知道谁注册了该服务,因为每个字段都经过哈希处理和加盐处理?这有什么缺点吗,因为互联网上没有太多关于它的信息?

由于以下几个原因,对用户名和电子邮件地址进行散列和加盐并不常见:

可用性

如果您的电子邮件地址经过哈希处理,网站将无法显示您的电子邮件地址,因为该值已被哈希处理。

安全

从安全的角度来看,对您的电子邮件地址进行哈希处理不会有太大好处。想象一下,如果有人可以访问您的电子邮件地址,他们可以使用相同的哈希算法并通过遍历数据库轻松找到您的凭据。这就是为什么一些网站实施了单独的 登录验证名称和显示名称 。登录名保持散列(未加盐),而显示名称未散列存储。除非攻击者拥有您的登录名 name/address,否则无法破坏您的数据。在这种特殊情况下,对电子邮件地址进行哈希处理可确保您的数据完全安全。

It is not standard practice to salt and hash usernames / email addresses.

确实,如果在存储之前进行加盐和哈希处理,攻击者将无法识别存储的用户名/电子邮件地址。事实上,没有人将能够访问用户名/电子邮件(包括系统管理员等授权用户)。

  • 听起来很安全,那为什么这是个问题?

当用户尝试登录时,他们将发送用户名(或电子邮件)和密码。由于每个盐对于该特定用户名都是唯一的,因此将 username/email 与存储的散列 username/email 相关联的唯一方法是 测试每个盐 + 散列组合,直到找到匹配项或每个条目都被尝试/拒绝。

虽然对于由少数用户组成的数据库来说这可能是可行的,但在实践中这是不可行的,因为散列计算要求很高。想象一下等待数小时或数天的登录服务来计算每个 salt+hash 组合,结果发现用户名只是拼错了。

此外,如果您要加盐用户名,那么您将如何防止重复?

用户名必须是唯一的。如果您对用户名加盐,那么您将无法阻止多个用户使用相同的用户名。

  • 开发人员可以采用哪些其他方法来保护信息?

最明显的解决方案是数据库加密。虽然这有点超出你的问题范围,Wikipedia has a good article covering this topic.