TOTP 是什么意思
TOTP 是 time-based one-time password,也就是基于时间的一次性密码。它通过共享设置密钥和当前时间生成一组短数字验证码,因此验证码会随着时间推进而变化。
TOTP 是许多 Authenticator 应用和账号安全系统使用的基于时间的一次性密码方案。本指南解释 2FA、MFA、OTP、Base32 设置密钥、otpauth 链接、算法、位数和常见 30 秒刷新周期这些概念。
TOTP 是 time-based one-time password,也就是基于时间的一次性密码。它通过共享设置密钥和当前时间生成一组短数字验证码,因此验证码会随着时间推进而变化。
TOTP 生成器会解码设置密钥,把当前 Unix 时间切分成时间步,使用 SHA-1、SHA-256 或 SHA-512 等 HMAC 算法计算,再截断成指定长度的数字验证码。
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 和服务端不会互相发送当前验证码,而是分别通过各自时钟计算。服务端可以接受相邻的少量时间步来容忍普通时钟偏差,但每多接受一个窗口都会延长截获验证码可能有效的时间,因此验证窗口应保持较小。
公式使用 Unix 时间,而不是界面显示的本地时区。只修改时区标签通常不会改变 TOTP 验证码,但系统时钟本身不准确会让计数器落入其他时间步,从而导致正确设置密钥生成的验证码被拒绝。
TOTP 在密码之外增加了一个独立因素,但它不具备抗钓鱼性。攻击者可以实时转发当前验证码,拿到共享设置密钥的人也能计算后续验证码。请保护设置密钥和恢复码、确认登录网站来源;如果服务支持抗钓鱼认证,优先考虑 Passkey 或硬件安全密钥。
OTP 是一次性密码的总称,TOTP 是基于时间的 OTP。2FA 表示两因素认证,MFA 表示多因素认证。TOTP 验证码经常作为 2FA 或 MFA 中的一个认证因素。
手动设置 Authenticator 时看到的密钥通常是 Base32 格式,字符范围是 A-Z 和 2-7,也可能带空格便于阅读。空格只是显示格式,实际计算会使用规范化后的密钥字节。
很多二维码内部包含 otpauth://totp/ URI。这个链接可以携带账号标签、issuer、secret、algorithm、digits 和 period,让兼容的 Authenticator 工具准确配置生成器。
本站可以通过 Base32 secret 或 otpauth URI 在浏览器本地生成 Authenticator 风格的 TOTP 验证码。URL 快捷填入推荐使用 #secret=YOUR_BASE32_SECRET 这种 fragment 形式,因为 fragment 不会随 HTTP 请求发送。
标准 TOTP 验证码会把共享密钥和时间步计数器结合起来,再经过 HMAC 与动态截断得到数字验证码。这个表格总结了 Authenticator 应用最常见的参数。
| 参数 | 在 TOTP 中的作用 | 常见值 |
|---|---|---|
| 共享密钥 / Base32 设置密钥 | 服务和 Authenticator 共同保存的私密值,用来生成每一次验证码。 | 必填 |
| 时间步长 / 周期 | 每个验证码窗口的长度,通常由 Unix 时间除以周期得到计数器。 | 30 秒 |
| HMAC 算法 | 动态截断之前使用的哈希算法。 | SHA-1 |
| 验证码位数 | 取模后显示的数字长度。 | 6 位 |
| issuer 和账号标签 | otpauth URI 里的显示信息,不改变 TOTP 计算结果。 | 可选 |
不完全是。TOTP 是生成 OTP 的一种方法。很多服务把 TOTP 验证码作为 2FA 的第二个因素,所以用户通常会把生成出来的 TOTP 值叫作 2FA 验证码。
TOTP 算法使用时间步,30 秒是常见默认值。时间步更短会更不宽容,时间步更长则意味着每个验证码有效时间更久。
不可以。有效的 TOTP 验证码需要共享设置密钥,以及匹配的 period、algorithm、digits 等参数。没有 secret 就无法计算正确验证码。
推荐使用 #secret=YOUR_BASE32_SECRET 这种 fragment 快捷方式。fragment 留在浏览器中,不会像 path 或 query 一样发送到服务器。
不会。TOTP 使用 Unix 时间,不使用界面显示的时区标签。但设备时钟仍需准确,因为过快或过慢的时钟可能选择错误的时间步计数器。
Base32 是设置共享密钥时使用的可读编码。生成器会先把它解码为密钥字节,再通过 HMAC、时间步计数器、动态截断和位数取模得到 TOTP 验证码。
不能。钓鱼网站可以实时转发仍在有效期内的 TOTP 验证码,复制到设置密钥的人也能生成后续验证码。账号服务支持时,Passkey 和硬件安全密钥可以提供抗钓鱼认证。