将密码发送到用户电子邮件是否安全?

信息安全 加密 密码 密码学 哈希 电子邮件
2021-08-21 02:22:31

通过电子邮件向用户发送密码的安全性如何,因为电子邮件不受 HTTPS 保护。

保护它的最佳方法是什么?我应该使用加密吗?

4个回答

永远不应以明文形式发送密码,也不应以明文形式存储它们。您应该使用慢速单向加密散列(例如 bcrypt 或 PBKDF2)对它们进行散列。如果用户忘记了密码,您可以为他们提供“重置密码”功能,该功能会向他们的帐户发送一次性重置链接。

如下方案是合理的:

  • 使用盐加 bcrypt / PBKDF2散列所有密码在这里查看我的推理(编辑,2019 年 3 月:使用 Argon2
  • 登录时验证哈希。
  • 如果用户忘记了密码,请使用存储在数据库中的随机生成的重置令牌向他们发送安全的一次性重置链接。令牌必须是唯一且保密的,因此在数据库中对令牌进行哈希处理,并在使用链接时进行比较。
  • 强制令牌只能用于重置请求它的用户的密码。
  • 令牌一旦使用,必须从数据库中删除,不得再次使用。
  • 让所有与密码等效的令牌(包括重置令牌)在短时间内(例如 48 小时)后过期。这可以防止攻击者在以后利用未使用的令牌。
  • 立即显示一个表单以允许用户设置新密码。不要使用临时随机生成的密码!
  • 通过 SSL 完成所有这些操作。

我强烈建议阅读基于表单的网站身份验证的权威指南,以获取有关如何构建安全登录系统的全套指南。

电子邮件不安全。因此,通过电子邮件发送密码存在安全风险。为了降低风险,您可以(在某些情况下)使通过电子邮件发送的密码是一次性密码,这只会解锁用户选择自己的新密码的可能性。

这就是 I-forgot-my-password-for-this-Web-site 系统的功能:用户单击“该死,我忘记密码”按钮,然后发送一封电子邮件,其中包含一个 URL(使用 HTTPS ) 它嵌入了一个随机会话标识符,并指向一个允许用户选择新密码的页面。URL“一次性密码”。使用此方案,您至少可以从服务器端知道该 URL 的使用时间。

如果您可以正确地进行加密,即如果您可以发送使用用户公钥加密的 OpenPGP 或 S/MIME 消息,那么用户就有一对私钥/公钥:在这种情况下,您为什么要使用密码?

向用户发送密码是一种不好的做法,因为这意味着您拥有用户密码的明文副本。

我想不出这样做的充分理由。还有其他更安全的方法来完成所需的工作。

有关电子邮件安全的一般答案,我建议您阅读链接,其中包含一些很好的信息。

如果您必须通过电子邮件发送敏感信息,请使用 PGP 等方案或其他加密技术来保护数据。

如果您首先要发送“清除密码”(注册过程除外),那么您做错了。永远不要存储明文密码!很多像索尼音乐这样的公司最近都被烧毁了……让我告诉你,消费者并不高兴。