我正在建立一个网站,我正在实施两个因素认证(2FA)。第二个因素将是一个随机的6位代码,就像那些来自Authy。本网站将存储非常机密的信息。
在锁定2FA代码之前,我正在考虑限制用户的尝试次数。这是为了防止蛮力。但是,有多少尝试是合理的呢?或者应该有一个临时锁定,因为2FA代码旋转,攻击者将不会从中得到任何东西?
发布于 2018-05-16 15:11:49
许多人错误地认为,由于代码经常旋转,所以不受暴力的影响。事实并非如此。如果假设每秒有100次尝试,且代码有效时间为30秒,攻击者在代码旋转之前就有100*30 = 3000猜测,这就有可能使3000 / 10^6 = 0.3%成功。这可能看起来很低,但这只是30秒,攻击者可以再次尝试后续代码。要想获得50%的成功机会,他们只需尝试ln(50%) / ln(99.7%) = 230.7 30秒,即大约2小时。
如果您不确定为什么旋转代码不能解决这一问题,请尝试这样想:攻击者可以猜测每个代码的范围为000000至002999,而代码有可能在此范围内,因此在生成多个代码之后,很有可能最终落入该范围。
如果将次数限制为每5秒1次,则为ln(50%) / ln(99.9994%) 30秒周期,约为40天。这可能仍然不够好的高价值帐户,所以我肯定会建议额外的措施,以防止蛮力。然而,这些措施应该是更难回答的,正如评论中所述,由于第二个因素尝试失败而完全锁定帐户可能允许DoS,一般情况下,用户可能会感到沮丧。如果密码在过去一天左右每分钟通过一定次数的尝试,那么记录每次尝试并警告用户更改密码就足够了。
Let s be the chance of success for a single 30 second period
Let n be the number of 30 second periods
Let t be the total chance of success over all periods如果你有s成功的机会,那么你就有失败的机会。如果您多次尝试,您可以将每次尝试获得失败的总机会乘以失败的概率,因此(1 - s)^3是失败的机会与3次尝试的机会,而1 - (1 - s)^3是至少在3次尝试中成功的机会。这使我们能够得出以下公式:
t = 1 - (1 - s)^n然后,我们可以为n求解给定的s和t:
(1 - s)^n = 1 - t
ln( (1 - s)^n ) = ln(1 - t)
n * ln(1 - s) = ln(1 - t)
n = ln(1 - t) / ln(1 - s)因此,对于t = 0.5和s = 0.003:
n = ln(1 - 0.5) / ln(1 - 0.003)
= ln(0.5) / ln(0.997)
≈ 230.7如果你想知道攻击者需要多长时间才能获得99%的成功机会,每次6次(每5秒1次),s = 6/1000000 = 0.000006和t = 0.99,大约767,526次或266.5天。对于1%的机会,以同样的速度t = 0.01,这大约是1675个周期或14个小时。
https://security.stackexchange.com/questions/185905
复制相似问题