直接回答:TOTP(RFC 6238)基于共享密钥和当前时间各自独立计算一次性口令。绑定 MFA 时服务器生成一个随机密钥(通常 Base32 编码成二维码给用户扫码),双方各自保存。验证时双方用 HMAC-SHA1(也有 SHA-256/512 变体)对"当前 Unix 时间戳除以 30 秒的时间步"做运算,再经动态截断(dynamic truncation)得到 6~8 位数字。只要密钥相同、时钟大致同步,算出的码就一致,全程无需网络交互。

展开解析:核心公式是 TOTP = Truncate(HMAC(K, floor(T / 30)))。动态截断取 HMAC 结果最后一字节的低 4 位作为偏移,从该处取 4 字节、掩掉最高位后对 10^6 取模得到 6 位码。服务器端通常容忍前后各 1 个时间步(±30 秒)以吸收时钟漂移,但不能无限放宽,否则扩大重放窗口。密钥绝不能随验证码一起传输,二维码只应在绑定时展示一次;服务器端存储密钥应加密,丢失后必须走人工申诉重置。TOTP 防住了"密码泄露即沦陷",但防不住实时钓鱼转发,这正是 FIDO2/WebAuthn 逐渐取代它的原因。

追问方向:HOTP 与 TOTP 的区别?动态截断算法的细节?MFA 重置流程如何防社工?

(约 430 字)