TOTP使用的是绝对时间
TOTP通常把当前Unix时间除以固定周期,得到一个时间计数值。Unix时间表示从统一起点经过的秒数,不依赖界面显示的是北京时间、东京时间还是纽约时间。
因此人在国外、切换时区或进入夏令时,本身不会改变正确验证码。只要设备显示的绝对时间准确,验证器仍能与服务器一致。
为什么看起来像时区导致错误
用户手动修改时区时,有时会同时关闭自动校时或误改日期和时钟,真正的问题是系统时间发生偏差。旧设备长期离线、电量耗尽或虚拟机暂停恢复,也可能让时钟慢几十秒。
TOTP常见周期为30秒,偏差一个时间窗口就可能生成前一组或后一组验证码。
用户端排查步骤
- 开启系统的自动设置日期、时间和时区。
- 连接网络等待系统完成校时,不要只观察分钟显示。
- 完全关闭并重新打开验证器应用。
- 等待下一组验证码刷新后立即输入。
- 仍然失败时检查是否选错账户或使用了旧绑定条目。
服务器也需要准确校时
如果同一服务的许多用户同时遇到TOTP失败,问题可能在服务器。运维人员应检查NTP同步状态、容器和虚拟机时间,以及验证程序使用的时间源。
服务端可以接受相邻的有限时间窗口来容忍网络延迟,但不应无限扩大,否则会增加可被猜中的候选验证码数量。
时区和周期是两个不同参数
时区通常不参与TOTP计算,周期却直接参与。主流周期是30秒,但服务也可以配置其他数值。即使时间完全准确,只要验证器与服务器周期不同,结果仍不会一致。
使用标准otpauth地址导入可以减少手动选择错误,因为地址能够携带period等参数。
常见问题
出国后需要重新绑定2FA吗?
通常不需要。时区变化不影响基于Unix时间的TOTP,只需确保手机保持自动校时。
手机时间看起来正确,为什么验证码仍错误?
肉眼通常只能确认到分钟,TOTP可能因几十秒偏差失败;也可能是旧密钥、错误账户、算法或周期不一致。