全部文章

2FA 验证码无效怎么办?常见原因和解决方法

验证码一直提示错误时,先别反复输入同一个。问题几乎都出在三个地方:设备时间不准、验证码已经过了那 30 秒、密钥复制得不完整。按下面的顺序查,两分钟能定位。

本文另有 English

2FA 验证码无效怎么办?常见原因和解决方法

先按这个顺序查

  1. 看设备时间是不是自动同步的,差半分钟就足以导致验证码全错。
  2. 等验证码刷新,用一个剩余秒数还剩 20 秒以上的新码。
  3. 把密钥重新复制一遍,确认字符数对、没有缺字符。
  4. 确认这把密钥是当前绑定的那把,不是之前那次绑定留下的。

大多数情况在前两步就解决了。下面是每一种情况的具体判断方法。

系统时间不准

这是第一嫌疑人。TOTP 把当前时间当作计算输入,双方时间落在同一个 30 秒窗口里才能算出同样的结果。设备时间慢了 40 秒,算出来的就是上一个窗口的验证码,平台不认。

时间偏差有个明显特征:密钥完全正确,但每一个验证码都错。如果是密钥的问题,表现是一样的全错;区分方法是先把时间排除掉,剩下的才可能是密钥。

打开自动同步:

  • Windows:设置 → 时间和语言 → 日期和时间,打开「自动设置时间」,再点一次「立即同步」。
  • macOS:系统设置 → 通用 → 日期与时间,打开「自动设置日期与时间」。
  • Android:设置 → 系统 → 日期和时间,打开「自动设置」。
  • iOS:设置 → 通用 → 日期与时间,打开「自动设置」。

Windows 上「立即同步」按钮值得单独点一次。开着自动同步但很久没同步过的机器仍然可能偏几十秒——尤其是长期休眠、虚拟机、或者刚改过时区的机器。

验证码刚好过期

验证码只在它那 30 秒里有效。看到倒计时只剩三四秒的时候开始复制粘贴,输进去往往已经是下一个窗口了。

平台通常会额外接受相邻的窗口,但不能指望。稳妥做法是等它刷新,拿一个剩余秒数在 20 秒以上的新码再输。

还有一种情况容易被忽略:同一个验证码被用过一次后,很多平台不再接受它,即使还在有效期内。所以登录失败后重试,要用新的验证码,不是把刚才那串再输一遍。

密钥复制错了

密钥错的表现和时间错一样——全错。所以时间排除之后就该查这里。

重新从平台复制一次,然后核对这几点:

  • 字符数。常见是 16 或 32 个。数出来是 15 或 31,说明少了一个。
  • 只含 A–Z 和 2–7。出现 0、1、8、9 或者 O、I、L,基本可以断定抄错了,因为 Base32 的字符表里没有这些。
  • 末尾的 =。有些平台会补一到几个等号,那是填充符,去掉或留着都不影响。
  • 大小写。不用管,Base32 不区分大小写。

多了空格或少了字符

平台为了方便阅读,经常把密钥每 4 个字符空一格显示:

显示出来的样子
JBSW Y3DP EHPK 3PXP

空格不是密钥的一部分。多数工具会自动去掉,但从网页上拖选复制时容易出问题:

  • 选区带上了前后的换行,或者带上了旁边一段说明文字。
  • 选区从中间开头,漏掉了第一个字符。
  • 复制的是被界面截断显示的版本,后面还有没显示出来的字符。

最可靠的办法是用平台自己的复制按钮,而不是手动拖选。没有复制按钮时,把密钥先粘贴进纯文本编辑器看一眼,确认没有多余内容再用。

用的是旧密钥

关掉两步验证再重新开启,平台会发一把全新的密钥,旧的立刻作废。

这件事发生过之后,如果你手上留着的还是上一次那把,验证码会一直错。表面看不出来——两把密钥格式一样,都是合法 Base32,工具照样能算出码,只是算出来的码平台不认。

判断方法:回到平台的两步验证设置页看一眼当前状态。如果显示已绑定但你不确定绑的是哪一把,最快的路是关掉再重新绑定一次,用新给出的密钥。

多账号场景下这类问题尤其常见——同一批账号里有几个重新绑定过,密钥表没跟着更新。

账号已经被重新绑定过

和上一条相邻但不是同一件事:这里指的是别人改过绑定。

买来的账号、共用的账号、之前交接过的账号,都有可能被前一个持有者或同事重新绑定过两步验证。这种情况下你手上的密钥从来就不是当前生效的那把。

如果密钥格式没问题、时间也准,但验证码从第一次尝试就一直错,而且你无法确认这把密钥的来源,那么继续试没有意义——密钥本身已经不对了。

平台用的不是标准 TOTP

少数服务的「验证码」不是 TOTP:

  • 银行和部分企业系统的动态令牌,可能用基于计数器的 HOTP,或者厂商自有算法。
  • 有些平台的「验证码」是发到邮箱或短信的,只是长得像。
  • 少数系统的令牌绑定设备,密钥不可导出。

判断依据很简单:能不能拿到一串 Base32 密钥或 otpauth 链接。拿不到,说明它不是标准 TOTP,任何通用验证器都算不出它的码。

参数不是默认值

TOTP 的默认参数是 SHA-1、6 位、30 秒。绝大多数平台用默认值,但确实有例外。

参数不匹配的表现和密钥错误一样:全错。区别在于密钥其实是对的,只是算法配置不对。

参数写在 otpauth 链接里:

非默认参数的 otpauth 链接
otpauth://totp/Example:me@example.com?secret=JBSWY3DPEHPK3PXP&algorithm=SHA256&digits=8&period=60

只复制 secret= 后面那一段,algorithm、digits、period 就丢了,算出来的码必然对不上。能拿到整条链接时就整条用。

看到平台要求输入 8 位验证码,或者倒计时是 60 秒而不是 30 秒,都是参数非默认的信号。原理层面的说明见TOTP 验证码是什么。

手机和电脑时间不一致

同一把密钥在两台设备上算出不同的码,只有一个原因:两台设备的时间不在同一个窗口里。算法输入只有密钥和时间,没有第三个变量。

这其实是个好用的诊断手段。手机验证器和电脑上的工具用同一把密钥各算一次:

  • 两边一样、平台还是不认 → 问题不在你这边的密钥和时间,往下看服务端时间偏差和重新绑定。
  • 两边不一样 → 至少有一台时间不准。以自动同步过的那台为准,另一台去校时间。

服务端本身有时间偏差

平台自己的服务器时间也可能偏。这种情况罕见,但存在,特点是你这边所有设备算出的码一致、时间也都同步过,平台仍然拒绝。

能做的事有限:

  • 试一下上一个和下一个窗口的验证码。手边有两台时间略有差异的设备时,正好可以拿来试。
  • 隔十几分钟再试一次,服务端校时后可能自行恢复。
  • 换客户端试(网页版和 App 有时走不同的校验路径)。

如果平台状态页或社区有同期的相关反馈,那就是等它修,不是你的问题。

什么时候该停手

连续失败会触发风控,多数平台会临时限制登录,继续硬试只会把情况变复杂。

出现下面任一情况,就别再输验证码了:

  • 已经确认时间准确、密钥完整,但一直被拒绝。
  • 不确定手上这把密钥是不是当前绑定的那把。
  • 平台已经提示尝试次数过多或临时限制。

改走这两条路:

  1. 用恢复码登录。开启两步验证时给的那一组一次性代码,就是为这个场景准备的。进去以后关掉两步验证再重新绑定,会得到一把新密钥,顺手把新的恢复码也存好。
  2. 没有恢复码,走平台的账号申诉。准备好能证明账号归属的材料。这条路要花时间,但比反复触发风控更快到终点。

用工具区分「密钥问题」和「时间问题」

排查里最花时间的一步,是判断到底该怀疑密钥还是怀疑时间。有个直接的办法。

把密钥粘贴进 2FA 验证码生成器,页面会给出当前验证码和剩余秒数:

  • 提示密钥格式不对 → 问题在密钥,回去重新复制。
  • 能出码,和手机验证器一致 → 密钥没问题,往时间和绑定状态上查。
  • 能出码,和手机验证器不一致 → 两台设备至少有一台时间不准。

验证码在浏览器本地算出来,密钥不会被发到 EnvTrace 的服务器,也不会被存下来。多个账号可以一行一个密钥一起对照,行首写上备注区分。

要弄清密钥本身该是什么样、从哪里拿,见2FA 密钥是什么。如果还不清楚登录时验证码该填在哪一格,见2FA 密钥使用教程。

常见问题

为什么密钥是对的,验证码却一直错?
最常见的是设备时间偏差。TOTP 用当前时间参与计算,设备时间差半分钟以上,算出的就是别的时间片的验证码。把系统时间改为自动同步再试。
验证码错误几次会锁账号吗?
多数平台会在连续失败若干次后暂时限制登录。所以不要连续硬试同一串数字,先定位原因再输入。
两步验证的验证码有几秒有效?
一个验证码对应一个 30 秒窗口。多数平台会额外接受相邻窗口,实际容错约正负 30 秒。看到剩余秒数只剩几秒时,等下一个再输。
验证器和网页工具算出来的码不一样,该信哪个?
两边算法相同,结果不同只可能是密钥不同或时间不同。先确认两边密钥完全一致,再检查两台设备的时间。
所有办法都试过还是不行怎么办?
改用恢复码登录,进去以后关掉两步验证再重新绑定一次,会得到一把新密钥。没有恢复码就走平台的账号申诉流程。

用密钥重新算一次验证码

粘贴 Base32 密钥,对照当前验证码和剩余秒数,确认问题出在密钥还是时间。

打开 2FA 验证码生成器→
继续阅读

相关文章