【问题标题】:Is there a need to expire email verification code? [closed]邮箱验证码是否需要过期? [关闭]
【发布时间】:2020-12-20 04:27:21
【问题描述】:

我已经注册了一个 GitHub 帐户来测试他们的电子邮件验证过程。所以:

  1. 他们向我发送了一封包含链接的电子邮件,其中包含我的用户名和 40 个字符的代码,例如: https://github.com/users/USERNAME/emails/120066679/confirm_verification/47889d71648523e5d99db5b969f59809c2715fb6

  2. 我没有点击链接

  3. 4 天后,我又给我发了一封(提醒)我必须验证我的电子邮件,其中包含另一个不同的 40 字符代码的链接

那么,更改 40 字符代码的目的是什么?我记得,其他服务无论如何都会使验证码过期。如果验证链接中已经有用户名,真的需要这样做吗?在暴力破解的情况下,我可以只计算与特定用户相关的失败尝试并阻止它,对吗?

附:同样有趣的是,链接中emails/120066679 的目的是什么? (这两个字母相似)

【问题讨论】:

  • 您知道他们是否会过期链接、何时过期以及重放攻击的后果是什么?您正在做出假设,它们可能与 Github 考虑的威胁模型相匹配,也可能不匹配。
  • 我投票结束这个问题,因为这是一个关于安全实践的问题,而不是help center 定义的编程问题。你应该在 Security.SE 上提出这个问题。

标签: email security authentication email-verification


【解决方案1】:

嗯,电子邮件验证链接的目的是确保您确实拥有该电子邮件。大多数验证链接仅包含一些秘密,它们会以您的方式发送给您,您只有拥有这些秘密才能验证电子邮件地址。

他们更改代码的原因是因为它可能会过期。在这种情况下,您无法激活该帐户,因此他们向您发送了另一个帐户,以防您想继续。

如果他们不发送这样的秘密怎么办?

在这种情况下,没有什么可以阻止攻击者“验证”他们实际上无法控制的电子邮件。他们只需访问插入用户名的 url 并激活帐户即可。

普通用户不会这样做,但垃圾邮件发送者可能会这样做。

对于蛮力的情况: 如果秘密足够随机,并且密钥空间足够大,那么试图猜测它是徒劳的。

我们可以假设这是一个随机的 40 十六进制字符数,这给了我们:

16**40 == 1461501637330902918203684832716283019655932542976

它的可能值。可以肯定地说,在不久的将来没有人会猜到这个数字。

【讨论】:

    【解决方案2】:

    验证码快速过期是最佳做法的原因有多种。

    如果认为使用验证码进行保护是合适的,最安全的做法是使其不仅足够复杂,而且在最短的时间内有效。如果你只让代码在需要的时间内工作(通常很短),你就会降低有人滥用它的风险。 (例如,有人可以以编程方式“猜测”代码 - 此练习的时间越多,成功的机会就越高。)

    此外,存储此类数据效率不高。它使用过一次,不包含任何实际信息,一旦使用,就可以“扔掉”。存储任何在存储时不会增加价值的东西都不是一个好习惯。

    此外,用户不立即/很快使用代码的情况非常罕见。对于一小部分代码在用户尝试使用时过期的情况,生成新代码会更有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      • 2018-03-22
      • 1970-01-01
      • 2022-12-11
      相关资源
      最近更新 更多