H6.03.5OTP brute-force attempt limit设计研究

验证码尝试次数需要限制,防止被暴力枚举

别名: 验证码穷举 · OTP rate limit · 一次性码猜测

概念解释

短数字码的空间小,不限制提交次数就可以被逐个试完。尝试次数限制指对同一码、同一登录挑战,在有效期内只接受有限次核对,超出则作废该码并要求新的发送,而不是继续让框可提交。这条管的是猜测窗口,不管人怎么把码贴进框,也不把限制误写成魔法链接点一次就失效——链接的熵通常高得多,主要威胁不是枚举。

机制

六位十进制只有一百万种可能。在线核对若每秒可试许多次,有效期内穷举是计算问题而不是密码学问题。限制把攻击从「试完空间」压成「在几次里碰运气」,同时必须处理误伤:人打错、粘贴多一位、自动填充失败后连点。只按 IP 限流会被共享出口绕过,只按账号限流会变成对特定用户的拒绝服务。更稳的单位是这一次挑战:为这次发送的码计失败次数,码作废后次数清零,新码重新计。界面若在次数用尽后仍显示可提交的框,人会以为是码错了而不是窗口关了,于是反复重发,把自己锁进通道限流。

怎么研究

在受控的核对接口上测量:无限制、仅 IP 限流、按挑战限流,看穷举成功所需请求量,以及正常人打错后是否还能完成。

自变量:允许的失败次数、计数键(IP、账号、挑战 ID)、达到上限后是静默失败还是作废码、是否提示剩余次数。 因变量:随机猜测命中率(应接近机会水平且次数用尽后为零)、合法用户一次打错后的完成率、因限流产生的额外重发。

不要公布或追求「多少次刚好安全」的万能数字;空间大小、TTL、核对速率一起决定窗口,实验室数值不能直接当产品配额。真人研究重点是上限到达时的文案:人是否理解要重新要码,而不是继续改最后一位。

边界

验证器 TOTP 每 30 秒滚动,限制要按窗口而不是按「终身三次」,否则对时不准的人会被永久锁。语音播报的码被听错的概率更高,过紧的次数会逼人改走更弱的通道。离线场景没有在线核对,次数限制不适用。把限制做成长时间锁定整账号,会把枚举防护变成对本人的拒绝服务;作废当次码、短时拒绝对核,比锁账号更对准威胁。邮件或短信的发送次数是另一条限流,与核对次数叠加时要避免人既不能试也不能重要。

怎么落地

  • 按「这一次发送的码」计数失败核对,达到上限即作废该码,要求重新发送;不要在无限次提交上只靠 IP 节流。
  • 次数将尽时说明还剩几次,用尽时改文案为「请重新获取验证码」,并禁用提交直到新码发出。
  • 合法的一次粘贴失败(含空格、换行)先做规范化再计数,避免自动填充的格式问题立刻烧尽配额。
  • 验证:用脚本对同一挑战提交超过上限的随机码,确认不能登录且后续随机码也失败;再用真人故意打错一次再贴正确码,确认仍能通过。核对日志里失败应挂在挑战 ID 上,而不是只挂在 IP。

延伸

  • 同组H6.03.1 验证码需支持粘贴与自动填充 · H6.03.2 验证码有效期与重发间隔需明示 · H6.03.3 短信通道失败需有备用方式 · H6.03.4 免密登录链接一次性使用后应立即失效,防止链接被转发滥用 · H6.03.6 魔法链接与验证码两种免密方式的安全强度并不等同 · H6.03.7 免密登录仍需要设备层面的二次确认以防止链接被截获后滥用
  • 相邻H6.04 密码规则 · H6.11 密码找回与重置
  • 站内检索OTP brute force · online guessing · authentication rate limit

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/H6.03.5