一句话回答: 验证码会过期,是因为有效期越短、越安全——一条只活几分钟的码,就算被拦截或泄露,攻击者也几乎没有时间用它。大多数一次性码在 30 秒到 10 分钟内失效,或者一旦用过就立刻作废。这不是故障,而是设计。

你收到验证码,去倒了杯水,回来一输——「验证码已过期」。恼人,但这恰恰说明它在正常工作。一次性口令的全部意义,就在于「一次性」和「短命」。
一、为什么要设过期时间
一次性码防的是重放:攻击者截到一条码后,反复拿它去登录。给码设一个短短的有效期,就把这个窗口压到极小。想想它挡住的几种情况:
- 一条被拦截的短信,几分钟后再用已经无效。
- 一条你转发或截图的旧码,攻击者拿到时早已作废。
- 一条你没申请、却被诱导读出的码,等骗子输进去时也可能过了期。
有效期越短,可被滥用的时间就越少。这也是为什么很多系统在你输错几次后,会直接让当前码失效并触发频率限制。
二、不同验证码的过期方式
| 类型 | 典型有效期 | 过期机制 |
|---|---|---|
| 短信 / 邮箱验证码 | 5–10 分钟 | 服务器端计时,到点作废 |
| 验证器 App(TOTP) | 30 秒一轮 | 按时间片滚动生成 |
| 一次性使用 | 立即 | 用过即废,无论是否到期 |
| 备用码 | 不过期 | 一次性,用一个少一个 |
短信和邮箱的码由服务器记时:发码时记下时间戳,你提交时它检查是否超时。验证器 App 的TOTP 则完全不同——它不发码,而是手机和服务器各自根据当前时间算出同一个码,每 30 秒换一批,所以它天生每 30 秒「过期」一次。
三、为什么是「几分钟」这个量级
有效期是安全和体验之间的平衡。太短,网络稍有延迟你就来不及输;太长,被截获的码就有更多可乘之机。几分钟正好覆盖了「短信穿过运营商网络 + 你手动输入」的正常耗时,又不给攻击者留太多空间。这和验证码为什么是 6 位是同一种取舍思路:够用就好,不多不少。
四、验证器 App 的码总说过期?多半是时钟
如果你的验证器 App 生成的码频繁被拒、像「刚出来就过期」,原因几乎总是手机时钟漂移——TOTP 靠时间同步,你的手机时间偏了几十秒,算出来的码就和服务器对不上。开启「自动设置时间」通常一键解决。详见验证器 App 的码不对怎么办。
五、码过期了怎么办
- 请求一条新码,别硬试旧的——它不会复活。
- 收到就尽快输,别放着去做别的事。
- 用最新的一条。 如果来了好几条,旧的通常都失效了。
- 别狂点重发。 连续请求会触发频率限制,让你等更久。
常见问题
Q:为什么我的码这么快就过期? 多数码只有几分钟寿命,这是有意为之。如果感觉「秒过期」,先看短信是不是延迟了——你收到时它可能已经走了大半有效期。
Q:过期的码还能用吗? 不能。过期或已使用的码在服务器端已被作废,唯一的办法是申请新码。
Q:验证器 App 的码为什么每 30 秒就变? 因为 TOTP 按时间片滚动生成,每 30 秒一轮是标准设计,让每个码都短命且不可预测。
小结
验证码过期是安全特性,不是 bug:短有效期把被拦截或泄露的码能被利用的时间压到最小。收到就尽快输、永远用最新的一条;如果验证器的码总说过期,检查手机时钟同步。