带有链接与代码的帐户验证电子邮件

信息安全 验证 电子邮件
2021-08-24 21:49:21

我需要发送验证电子邮件,例如

  • 电子邮件验证
  • 重设密码
  • 电子邮件更改
  • 密码更改

过去,大多数 webapps 都会发送一封带有可点击验证链接的电子邮件,我单击该链接以返回网站并完成该过程。

这些天,我看到许多 web 应用程序发送一封带有验证码的电子邮件,我必须将其复制粘贴到浏览器中,有时它是一个很容易手动输入的简短随机数(例如,因为我在桌面上工作,但我读过我手机上的电子邮件)。

这两种方法的优缺点是什么?

我觉得“新”方式更多的是用户体验而不是安全性,但我不确定。哪个更安全,我应该考虑哪些权衡?

2个回答

总体目标是验证是否可以通过电子邮件地址联系到用户。

这是通过创建一个令牌来完成的,任何将该令牌传递回您的服务器的方式都可以,无论是让用户单击链接还是复制/粘贴(或重新键入)代码。

由于您的列表包括密码重置和电子邮件重置作为您可能发送令牌的原因,请记住,除了简单地验证电子邮件是否会到达用户之外,这些还有其他问题。攻击者可能会尝试猜测令牌。

攻击者可能更难以猜测更长的令牌,但用户可能不太愿意键入它们。

另一方面,可用性始终在安全性中发挥作用。最好的安全性不是最严格的;这是人们将使用的安全性,尤其是他们不会寻求解决方法。

具有安全意识的人越来越不愿意关注电子邮件中的链接。习惯于跟踪电子邮件中的链接的人也更有可能跟踪恶意电子邮件中的网络钓鱼链接。

此外,用户可能无法通过他们正在使用的计算机访问他们的邮箱,或者可能没有使用他们的电子邮件客户端默认打开的同一个 Web 浏览器。即,移动设备上的默认电子邮件客户端可能会打开手机/平板电脑自带的默认浏览器,而不是用户后来安装并经常使用的浏览器。

因此,对于简单的电子邮件验证或登录期间的第二个因素,用户键入的短代码就足够了,只要它们是使用由高熵源播种的加密安全伪随机数生成器 (CSPRNG) 生成的,例如 /dev/urandom 或您平台上的类似系统。您还可以包含一个包含该代码的链接,以防用户更容易使用,而不是复制和粘贴代码。这里的关键是,对于常见的事情(即日常),让用户尽可能容易地提高他们的安全性。

但是,如果用户试图更改有关其帐户安全性的某些内容,例如更改密码、更改其联系信息(电子邮件地址)或更改其第二个因素的任何部分(在您的情况下也是电子邮件地址),您应该使令牌更长,以至于让用户输入它没有意义。当然,仍然使用您的高熵源来播种您的 CSPRNG。

在所有情况下,这些令牌的寿命都应该非常有限,最多几个小时。让它们只供一次性使用(以便用户可以知道有人首先使用了他们的令牌,或者,如果窃听者速度很慢,窃听者就无法重复使用该令牌),并使令牌只能由该一个帐户使用。(有人为自己生成密码重置令牌,然后将用户 ID 更改为其他人的用户 ID,以这种方式访问​​他们的帐户。)所有登录和密码重置尝试都应通过 IP 和帐户进行限制,并且尝试失败应该被记录。

对我来说,关键在于验证过程的效率以及它在实践中的实际运作情况。

[ 验证码 ]

  • 可以根据您需要/想要的特定复杂性生成

  • 最有可能达到目标

  • 可以通过各种方式保护自己免受拦截(例如作为小图片发送,甚至作为类似验证码的模糊图片发送)

  • 没有什么能阻止您在已经打开的网页上输入代码

[验证链接]

  • 可能无法实际到达目标(可能被过多的垃圾邮件过滤器阻止)

  • 可能会被拦截和分析,这可能会导致您的安全受到破坏

  • 它可能永远不会被用户点击,因为任何具有基本安全性的公司都会训练它的用户在打开链接时非常小心,政策通常是默认情况下不点击它们

  • 即使用户想要单击它们,链接也可能会或可能不会工作,具体取决于公司政策和安全性(outlook 可以阻止它们,防病毒可以阻止它们,其他安全措施可以阻止它们)

由于上述原因,我会随时使用验证码。

请注意,大型在线游戏公司(如 Steam、EA、Crpytic 和许多其他公司)使用相同的方法:他们发送代码或图片中的代码。