在电子邮件中发送密码重置链接

信息安全 电子邮件 重设密码
2021-08-29 10:45:22

如今,当每个人都试图比对方更安全,当公司在信息安全上花费数十亿美元时,密码重置留下来似乎有点奇怪,在我看来,应该是每个人都关心的地方,仍然只依赖于在电子邮件提供商上。

在电子邮件中发送密码是个坏主意。我们都知道。谁知道电子邮件提供商的安全性如何?谁知道电子邮件帐户是否被黑客入侵?谁知道谁在听(中间人)?等等......因此,几乎没有人在电子邮件中发送密码。

但是密码恢复呢?大多数网站只是通过电子邮件发送一个链接,点击它后,您可以更改密码。因此,无论网站有多安全,破解用户都很容易,不是吗?

那么如何在不信任电子邮件提供商的情况下制作安全的密码重置系统呢?

我正在寻找一种适用于所有人的解决方案,而无需使用 SMS 等其他资源(也不是那么安全)。我正在寻找一个没有预算的程序员仍然能够使用它的答案。

以下是我想到的一些事情:

  • 安全问题——现在每个人都可以在网上找到任何关于任何人的信息,所以这些问题并不那么安全。
  • 恢复代码 - 对我说实话。如果网站要求您打印并保存恢复代码,您愿意吗?几乎没有人会。如果他们这样做了,他们可能会在一段时间后失去它......
4个回答

通过电子邮件以外的其他频段(例如 SMS 甚至蜗牛邮件)向用户发送唯一的文本字符串,也就是令牌(加密安全,随机生成)。只有当他们在您网站上的 Web 表单中输入该令牌时,他们才能在您的应用程序中更改密码。

或者使用所有用户必须拥有的物理设备,例如智能卡,才能使用您的应用程序。

如果没有真正好的解决方案,这可能是一个问题。这里有一些建议。它们都分为两组——不是很有效但实用(1-4)或有效但有点不实用(5-6)。请注意,它们可以或应该与普通电子邮件结合使用。

  1. 限制令牌有效的时间。
  2. 检查请求新密码的 IP 和单击链接的 IP 是否具有相同的地理位置。这可能会破坏某些人的功能,例如 Tor 用户,但可能仍然值得。(这仅有助于防止令牌在传输过程中被盗 - 如果攻击者可以访问电子邮件帐户,它不会做任何事情。)
  3. 询问有关用户的一些额外信息,例如邮政编码或此人最近向其发送私人消息的其他用户。这需要是 (a) 用户 100% 肯定知道的信息,并且 (b) 不容易公开获得的信息。两者都有风险,所以这会有所帮助是值得怀疑的。
  4. 与上述类似:使用老式的安全问题。也就是说,让用户明确地为您提供一条符合注册要求的信息。风险是用户只是随机输入一些内容而忘记了它,从而使帐户变砖。再说一次——如果有人真的想知道你母亲的娘家姓,我相信他们可以。
  5. “带外”发送令牌,例如在 SMS 或老式蜗牛邮件中。如果您担心它们的安全性,请将它们与电子邮件令牌结合使用。
  6. Vrtjason 在评论中建议:“为用户提供一份长寿命代币的简短列表,以防用户被锁定。用户将它们打印到硬拷贝上(可能在初次注册后立即)并将该列表放在他们的钱包中。”

有关密码重置功能的更多信息,请查看以下问题:如何实现“忘记密码”功能?

那么如何在不信任电子邮件提供商的情况下制作安全的密码重置系统呢?

您可能有“受信任设备”的概念——即,一旦完成有效登录,您就可以为该设备设置一个长期存在的令牌,该令牌存储为 cookie,并存储(散列)服务器端。

当密码重置令牌通过电子邮件发送时,只需通过检查受信任的设备 cookie 由先前已成功登录的设备完成密码重置。

该过程如下。用户访问您的页面,输入他们的电子邮件地址并获得令牌。在他们的电子邮件中点击链接以重置密码时,请确保设备标识符与之前登录的标识符相匹配。

它确实对重置设置了一些限制,因为用户无法从其他设备完成重置。您还应该允许经过身份验证的用户管理他们的受信任设备列表(例如,为了简单起见,您可以允许他们为其设备分配名称,或清除除当前设备之外的所有其他设备,这将擦除服务器端的记录他们)。

这将保护密码更改不被邮件提供商处的任何窃听者完成。

另一种可能性是采用双重身份验证,然后坚持验证他们的 2FA 设备以继续进行密码重置。

另一种选择可能是检查相同的会话用于重置请求和实际更改的密码。但是,在发送重置电子邮件之前,您需要以某种方式验证用户。例如,您可以问一些安全问题,但是如果邮件提供商可以阅读其他可能揭示一些可能答案的电子邮件(此选项提供完整性,但不推荐),这很弱(比安全问题通常更弱)。

另请参阅此答案

主要选项是:

  • 仅电子邮件验证- 大多数网站都这样做。它简单且本质上是免费的,并且对于论坛、电子商务、社交网络等网站来说足够安全。大多数用户接受他们需要信任他们的电子邮件提供商。

  • 安全问题- 最常见的附加安全机制。这可能是诸如“您的第一只宠物的名字是什么”之类的问题,也可能是诸如“上次交货的邮政编码”之类的潜在帐户详细信息。它们对用户来说很烦人(忘记了自己喜欢的颜色)并且提供有限的安全性 - 但对开发人员来说相当容易。

  • 替代验证- 最常见的是使用短信进行电话验证,尽管这可能是通过在物理信件中发布新密码来验证地址。对用户来说不是太难。有些人可能反对提供他们的电话号码,但这也阻止了垃圾邮件帐户。开发起来很简单——但是发送短信是有成本的,而实体信件的成本更高。这正成为大型供应商的首选。

  • 重置令牌- 这是更安全的选项之一,对开发人员来说很容易。但是,这对用户来说并不方便,也很少使用。

  • 亲自验证- 当用户注册时,获取他们的真实身份(姓名,可能是政府身份证号码)。要重置他们的密码,他们会带着您验证的政府 ID 亲自来找您。这是高度安全的——但开销很高,而且它不适用于全球网站。对此的一种变体是在注册时捕获生物特征详细信息(这意味着仅当面注册)并验证生物特征以重置密码。

  • 回避问题- 只允许人们使用 OpenID Connect 登录,并将忘记密码的问题留给他们的身份提供者。这可能是最好的战略选择,但 OpenID Connect 还不够成熟,这对用户和开发人员来说都很困难。

因此,有一系列具有各种优点和缺点的选项。鉴于您在问题中提出的所有限制,没有一种技术可以满足所有这些限制。您还没有说明您的网站是做什么的,但我希望简单的电子邮件验证是您的最佳选择。如果这确实是不可接受的,您可能应该花一些钱并进行短信验证。