2 因素验证码应该多长时间?

信息安全 验证
2021-09-03 23:00:30

我注意到许多提供 2 因素身份验证的服务已经从使用四位数字跃升至六位数字。但是,这对我来说似乎适得其反,因为数字是随机的,数字(应该)过期,并且有六位数字,您可能需要看两次或更多次手机

除了看起来更安全之外,还有什么理由吗?我的偏好是四位数甚至三位数,因为它们更容易记住和重新输入。

2个回答

是的,有一个原因 - 减少对多个帐户的暴力猜测攻击。

所有 2FA 实施都包括一个在线组件,该组件强制执行一组有限的重试,确保在攻击者尝试所有可能的密码之前很久就锁定帐户。2FA 密码的长度确定了恶意行为者在允许的给定尝试次数内猜测身份验证的概率。例如,如果 2FA 密码长度为 3 位,并且您有 3 次尝试输入它,那么随机猜测它的机会是 3/1000,即 0.33%。如果 2FA 密码长度为 4 位,则几率下降到 3/10000,即 0.033%。

虽然这肯定是他猜到您的特定密码的可能性很小,但想象一下攻击者拥有从某个服务器窃取的 10,000 个帐户的数据库。只攻击一个用户账号,他猜到的几率只有0.33%,但在509个不同的账号上各猜3次后,他猜中一个的概率是0.5,也就是50%。当他锁定 2,009 个帐户时,他成功猜到至少一个有效密码的概率为 0.99,即 99%。* 考虑到攻击者可能不需要成功攻击所有帐户即可获得访问权限 - 他可能只需要一个成功才能登录网站并站稳脚跟。

传统上,检测暴力攻击依赖于识别攻击者使用自动化脚本快速尝试多个请求。连续三个或十个锁定帐户的 IP 地址可能会触发警报。但是现代攻击者知道,通过缓慢进行,他们可以避免被发现。最近的高级攻击已经在野外证明了这种技术。考虑一个使用 10,000 台僵尸计算机组成的僵尸网络的攻击者。他可以命令他们每隔几分钟从所有 10,000 个 IP 地址缓慢启动一个随机请求,而不会触发速度警报或锁定任何帐户。他成功只是时间问题。

由于检测到这种攻击几乎是不可能的,剩下的唯一保护措施就是让攻击者更加困难,因此必须降低正确猜测密码的几率。实现此目的的两种方法是增加密码的最小长度(至 6 或 8 位)或减少允许的无效密码尝试次数。由于减少猜测次数会影响合法用户的可用性,算法设计者别无选择,只能增加每个密码的长度。

* 我的数学能力不是很好,所以这些数字可能不正确。一些数学倾向的编辑应该随意编辑这个答案,通过正确使用伯努利公式来包含证明。

John Deters 的回答解释了为什么为 2FA 代码使用更多数字是一件好事,但他没有展示数学。此外,他请读者检查他的计算,我认为有一些错误。我想进行编辑,但我意识到它太长了。因此,我将其作为单独的答案发布;如果大家一致认为我的计算是正确的,我们可以编辑他的答案(或者他可以自己做)。

目标是计算攻击者猜测给定长度的 2FA 代码需要多少次尝试。如果攻击者多次尝试,至少能猜到一次,则攻击者成功。“至少 1”很难直接计算,所以让我们使用一个技巧:

P(at least one code is guessed) = 1 - P(no codes are guessed)

现在,根据二项式公式k=0,在试验中获得完全成功的概率n很简单

(1-p)^n

所以

P(at least one code is guessed) = 1 - (1-p)^n

那么,对于给定p=3/1000的(帐户被锁定之前的 3 次尝试,其中可能的 3 位数代码总数为 1000),攻击者需要多少次尝试n才能使成功概率大于 50%?

P(at least one code is guessed) > 50%
1 - (1-p)^n > 50%
(1-p)^n < (1 - 50%)

(我将其保留为1 - 50%,而不是用结果 1/2 替换它,因为最后我们将重复计算以获得 99% 的概率,在这种情况下,我希望清楚我们不'不必写 0.99,而是 0.01。我可以在那里留下一个变量,比如desired_success_probability,但我认为它的可读性会降低)

现在,为了提取n,让我们取两个成员的以 (1-p) 为底的对数。由于底小于 1,并且底小于 1 的对数函数是单调递减的,我们必须反转不等式,所以我们得到:

n > log (1-p) (1 - 50%)

并且通过将基础更改为方便的基础(例如 10 或e- 只要计算器支持它就可以了),我们有解决方案:

n > log(1-50%) / log(1-p)

其中 p=3/1000 是

n > 230.7, that is, n >= 231.

因此,如果猜出一个代码的概率是 3/1000,那么在 231 次尝试之后,我们猜出至少一个代码的可能性比没有猜到的可能性更大。

如果攻击者想要达到 99%,而不是 50% 的成功概率,他需要

n > log(1-99%) / log(1-p)

意思是

n > 1532.75, that is, n >= 1533

而如果攻击者在每个账户被锁定之前可以尝试 3 次,这意味着他只需要在他被盗数据库中的 77 个账户就有超过 50% 的概率破解一个,或者 511 个超过 99% 的概率。

如果 2FA 代码的长度为 6 位,会发生什么情况?一次尝试的成功概率变为p = 3/1,000,000,这意味着攻击者需要至少 231,049 次尝试(77017 个帐户)才能有 50% 的成功机会。如果他想有 99% 的成功机会,他需要 1,535,055 次尝试(511,685 个帐户)。

简而言之,通过添加 3 位数字,我们将可能的代码数量增加了 1000 倍,并且为了保持相同的成功概率,攻击者需要进行略多于 1000 倍的尝试。如果这些是网上银行账户,是否值得多花 1-2 秒的时间来输入代码,以便让小偷的生活困难 1000 倍?在我看来,绝对。