首页

什么是 TOTP?

TOTP 是许多 Authenticator 应用和账号安全系统使用的基于时间的一次性密码方案。本指南解释 2FA、MFA、OTP、Base32 设置密钥、otpauth 链接、算法、位数和常见 30 秒刷新周期这些概念。

TOTP 是什么意思

TOTP 是 time-based one-time password,也就是基于时间的一次性密码。它通过共享设置密钥和当前时间生成一组短数字验证码,因此验证码会随着时间推进而变化。

TOTP 验证码如何生成

TOTP 生成器会解码设置密钥,把当前 Unix 时间切分成时间步,使用 SHA-1、SHA-256 或 SHA-512 等 HMAC 算法计算,再截断成指定长度的数字验证码。

RFC 6238 公式和时间步计数器

RFC 6238 把计数器定义为 T = floor((UnixTime - T0) / X)。使用常见的 T0=0 和 30 秒时间步 X 时,服务端与 Authenticator 会各自把 T 编码为 8 字节大端计数器,再通过同一个共享密钥 K 计算 HMAC。K、T0、X、算法和验证码位数全部一致时,同一时间步会得到相同验证码。

动态截断和前导零

TOTP 使用的 HOTP 步骤会取 HMAC 最后一个字节的低 4 位作为偏移量,从该位置读取 4 个字节并清除最高符号位,得到 31 位正整数,再对 10^digits 取模。结果不足指定长度时在左侧补零,因此 6 位验证码完全可能以 0 开头。

时钟准确性和验证窗口

登录前,Authenticator 和服务端不会互相发送当前验证码,而是分别通过各自时钟计算。服务端可以接受相邻的少量时间步来容忍普通时钟偏差,但每多接受一个窗口都会延长截获验证码可能有效的时间,因此验证窗口应保持较小。

为什么时区不会改变 TOTP

公式使用 Unix 时间,而不是界面显示的本地时区。只修改时区标签通常不会改变 TOTP 验证码,但系统时钟本身不准确会让计数器落入其他时间步,从而导致正确设置密钥生成的验证码被拒绝。

TOTP 的安全限制和钓鱼风险

TOTP 在密码之外增加了一个独立因素,但它不具备抗钓鱼性。攻击者可以实时转发当前验证码,拿到共享设置密钥的人也能计算后续验证码。请保护设置密钥和恢复码、确认登录网站来源;如果服务支持抗钓鱼认证,优先考虑 Passkey 或硬件安全密钥。

TOTP、OTP、2FA 和 MFA 的关系

OTP 是一次性密码的总称,TOTP 是基于时间的 OTP。2FA 表示两因素认证,MFA 表示多因素认证。TOTP 验证码经常作为 2FA 或 MFA 中的一个认证因素。

Base32 设置密钥

手动设置 Authenticator 时看到的密钥通常是 Base32 格式,字符范围是 A-Z 和 2-7,也可能带空格便于阅读。空格只是显示格式,实际计算会使用规范化后的密钥字节。

otpauth 链接和二维码

很多二维码内部包含 otpauth://totp/ URI。这个链接可以携带账号标签、issuer、secret、algorithm、digits 和 period,让兼容的 Authenticator 工具准确配置生成器。

浏览器本地生成

本站可以通过 Base32 secret 或 otpauth URI 在浏览器本地生成 Authenticator 风格的 TOTP 验证码。URL 快捷填入推荐使用 #secret=YOUR_BASE32_SECRET 这种 fragment 形式,因为 fragment 不会随 HTTP 请求发送。

TOTP 算法参数速查

标准 TOTP 验证码会把共享密钥和时间步计数器结合起来,再经过 HMAC 与动态截断得到数字验证码。这个表格总结了 Authenticator 应用最常见的参数。

参数在 TOTP 中的作用常见值
共享密钥 / Base32 设置密钥服务和 Authenticator 共同保存的私密值,用来生成每一次验证码。必填
时间步长 / 周期每个验证码窗口的长度,通常由 Unix 时间除以周期得到计数器。30 秒
HMAC 算法动态截断之前使用的哈希算法。SHA-1
验证码位数取模后显示的数字长度。6 位
issuer 和账号标签otpauth URI 里的显示信息,不改变 TOTP 计算结果。可选

标准与参考资料

常见问题

TOTP 和 2FA 验证码是同一个东西吗?

不完全是。TOTP 是生成 OTP 的一种方法。很多服务把 TOTP 验证码作为 2FA 的第二个因素,所以用户通常会把生成出来的 TOTP 值叫作 2FA 验证码。

为什么 TOTP 验证码通常 30 秒变化一次?

TOTP 算法使用时间步,30 秒是常见默认值。时间步更短会更不宽容,时间步更长则意味着每个验证码有效时间更久。

没有设置密钥可以生成 TOTP 验证码吗?

不可以。有效的 TOTP 验证码需要共享设置密钥,以及匹配的 period、algorithm、digits 等参数。没有 secret 就无法计算正确验证码。

TOTP 快捷 URL 哪种格式更安全?

推荐使用 #secret=YOUR_BASE32_SECRET 这种 fragment 快捷方式。fragment 留在浏览器中,不会像 path 或 query 一样发送到服务器。

设备时区会影响 TOTP 验证码吗?

不会。TOTP 使用 Unix 时间,不使用界面显示的时区标签。但设备时钟仍需准确,因为过快或过慢的时钟可能选择错误的时间步计数器。

Base32 是 TOTP 计算的一部分吗?

Base32 是设置共享密钥时使用的可读编码。生成器会先把它解码为密钥字节,再通过 HMAC、时间步计数器、动态截断和位数取模得到 TOTP 验证码。

TOTP 能抵抗钓鱼攻击吗?

不能。钓鱼网站可以实时转发仍在有效期内的 TOTP 验证码,复制到设置密钥的人也能生成后续验证码。账号服务支持时,Passkey 和硬件安全密钥可以提供抗钓鱼认证。