总体目标是验证是否可以通过电子邮件地址联系到用户。
这是通过创建一个令牌来完成的,任何将该令牌传递回您的服务器的方式都可以,无论是让用户单击链接还是复制/粘贴(或重新键入)代码。
由于您的列表包括密码重置和电子邮件重置作为您可能发送令牌的原因,请记住,除了简单地验证电子邮件是否会到达用户之外,这些还有其他问题。攻击者可能会尝试猜测令牌。
攻击者可能更难以猜测更长的令牌,但用户可能不太愿意键入它们。
另一方面,可用性始终在安全性中发挥作用。最好的安全性不是最严格的;这是人们将使用的安全性,尤其是他们不会寻求解决方法。
具有安全意识的人越来越不愿意关注电子邮件中的链接。习惯于跟踪电子邮件中的链接的人也更有可能跟踪恶意电子邮件中的网络钓鱼链接。
此外,用户可能无法通过他们正在使用的计算机访问他们的邮箱,或者可能没有使用他们的电子邮件客户端默认打开的同一个 Web 浏览器。即,移动设备上的默认电子邮件客户端可能会打开手机/平板电脑自带的默认浏览器,而不是用户后来安装并经常使用的浏览器。
因此,对于简单的电子邮件验证或登录期间的第二个因素,用户键入的短代码就足够了,只要它们是使用由高熵源播种的加密安全伪随机数生成器 (CSPRNG) 生成的,例如 /dev/urandom 或您平台上的类似系统。您还可以包含一个包含该代码的链接,以防用户更容易使用,而不是复制和粘贴代码。这里的关键是,对于常见的事情(即日常),让用户尽可能容易地提高他们的安全性。
但是,如果用户试图更改有关其帐户安全性的某些内容,例如更改密码、更改其联系信息(电子邮件地址)或更改其第二个因素的任何部分(在您的情况下也是电子邮件地址),您应该使令牌更长,以至于让用户输入它没有意义。当然,仍然使用您的高熵源来播种您的 CSPRNG。
在所有情况下,这些令牌的寿命都应该非常有限,最多几个小时。让它们只供一次性使用(以便用户可以知道有人首先使用了他们的令牌,或者,如果窃听者速度很慢,窃听者就无法重复使用该令牌),并使令牌只能由该一个帐户使用。(有人为自己生成密码重置令牌,然后将用户 ID 更改为其他人的用户 ID,以这种方式访问他们的帐户。)所有登录和密码重置尝试都应通过 IP 和帐户进行限制,并且尝试失败应该被记录。