阅读时间 7 分钟

TOTP 是什么?在线生成 2FA 验证码、换机迁移和备份完整指南

TOTP 验证码的原理、在线生成方法、验证器怎么选、换机怎么迁移、怎么备份才不会把自己锁在门外。

登录 GitHub、币安、Google 账号时要输入的那串 6 位数字,每 30 秒变一次,这就是 TOTP。大部分人只知道"打开验证器 App 抄个码",直到哪天手机丢了、换机没迁移、或者验证码一直提示错误,才发现自己对它一无所知。

这篇把 TOTP 讲清楚:它是怎么算出来的、怎么在线或在电脑上生成验证码、换手机怎么迁移、以及最重要的——怎么备份才不会把自己锁在账号外面。

TOTP 是什么?

TOTP 全称 Time-based One-Time Password,基于时间的一次性密码,标准是 RFC 6238。它是目前最常见的两步验证(2FA)方式之一,Google Authenticator、Microsoft Authenticator 这些 App 生成的就是 TOTP 验证码。

开启两步验证时,网站会给你一个二维码,里面其实就是一串密钥(Secret Key),形如 JBSWY3DPEHPK3PXP。你的验证器 App 和网站服务器各存一份。之后每次登录,双方用同一个密钥 + 当前时间各自算出一个 6 位数,一致就放行。

所以记住一句话:谁拿到了密钥,谁就能无限生成你的验证码。验证器 App 本身不重要,密钥才是关键。

验证码是怎么算出来的

不用懂密码学也能看明白,计算分三步:

  1. 算时间片:当前 Unix 时间戳除以 30,取整数。也就是说每 30 秒是一个"时间片",同一个时间片里算出来的码都一样
  2. 算 HMAC:用密钥对这个时间片数字做 HMAC-SHA1,得到一串 20 字节的哈希
  3. 截取成 6 位:从哈希里按规则截出 4 个字节,转成整数,再对 1000000 取余,不足 6 位前面补 0

整个过程只需要密钥和时间,不需要联网。这也是为什么飞行模式下验证器照样能用。

大多数网站用的都是默认参数:SHA1 算法、6 位数字、30 秒周期。少数服务会用 8 位或 60 秒,绑定时二维码里会写明。

怎么在线生成 TOTP 验证码

手边没有手机、或者想在电脑上直接拿码,可以用在线 TOTP 生成器。我自己维护了一个:

👉 TOTP 验证码生成器(otp.tbbbk.com)

  1. 打开页面,把密钥粘贴到 "Secret Key" 输入框(空格和大小写不影响)
  2. 位数和周期一般保持默认的 6 位、30 秒
  3. 页面会实时显示当前验证码和剩余秒数,环形进度条走完就会自动换下一个

验证码是在你的浏览器里用 JavaScript 本地计算的,代码开源在 GitHub,可以自己检查。如果你想把某个验证码分享给别人自助获取,可以看我之前写的自助验证码工具改造记录。

用在线生成器要注意什么

  • 只用本地计算、代码可查的工具。不明来历的网站完全可能把你输入的密钥偷偷发到服务器
  • 重要账号(邮箱、银行、交易所)别用在线工具,老老实实用验证器 App
  • 带密钥的链接等于密钥本身:密钥一旦出现在网址里,就会留在浏览器历史记录里,发给别人等于把账号的第二道锁交出去了

在电脑上生成:命令行和 Python

折腾党可以直接在终端里算。Linux / macOS 装个 oathtool:

# Debian / Ubuntu
sudo apt install oathtool
# macOS
brew install oath-toolkit

oathtool --totp -b JBSWY3DPEHPK3PXP

Python 用 pyotp 两行搞定:

pip install pyotp

python -c "import pyotp; print(pyotp.TOTP('JBSWY3DPEHPK3PXP').now())"

把密钥换成你自己的就行。写脚本自动登录、做服务器运维的时候很好用。

验证器 App 怎么选

App平台备份 / 同步适合
Google AuthenticatoriOS / Android可登录 Google 账号云同步;也能导出二维码大多数人
Microsoft AuthenticatoriOS / Android微软账号云备份用微软全家桶的
2FASiOS / Android开源,iCloud / Google Drive 备份想要开源又好用
AegisAndroid开源,本地加密备份文件注重隐私的安卓用户
Ente Auth全平台(含桌面)开源,端到端加密同步手机电脑都要用

我的建议:选一个支持导出的。最怕的就是验证码全锁在一个 App 里、换机导不出来。

换手机怎么迁移

以 Google Authenticator 为例:

  1. 旧手机打开 Google Authenticator → 右上角菜单 → 转移账号 → 导出账号
  2. 勾选要迁移的账号,会生成一个或几个二维码
  3. 新手机装好 Google Authenticator → 扫描二维码,扫旧手机上的码
  4. 新手机上逐个登录确认验证码能用之后,再删旧手机上的数据

如果开了 Google 账号同步,新手机登录同一个 Google 账号就会自动恢复。但我还是建议走一遍导出,别把鸡蛋放在一个篮子里。

怎么备份才不会被锁在门外

两步验证最大的风险不是被盗,而是把自己锁在外面。三层备份,至少做两层:

  • 恢复码:开启 2FA 时网站给的那一串备用码,打印出来或存进密码管理器
  • 密钥原文:绑定时点"无法扫描?"就能看到密钥文本,加密保存一份(密码管理器、加密笔记都行)
  • 第二个验证器:同一个二维码可以同时用两台设备扫,一台主用、一台放家里备用

常见问题

验证码一直提示错误怎么办?

九成是手机时间不准。TOTP 依赖时间,误差超过 30 秒左右就会失败。把手机设置成"自动设置日期和时间",Google Authenticator 安卓版还可以在设置里做一次时间校正。电脑上生成的同理,检查系统时间同步。

密钥格式不对、提示 invalid?

TOTP 密钥是 Base32 编码,只包含 A–Z 和 2–7 这些字符。复制时多了空格、混进了 0 和 1(Base32 里没有这两个)都会报错。

二维码里到底有什么?

扫出来是一个 otpauth:// 开头的链接,例如:

otpauth://totp/GitHub:yourname?secret=JBSWY3DPEHPK3PXP&issuer=GitHub&digits=6&period=30

secret= 后面那串就是密钥。所以二维码截图也要当密码一样保管。

TOTP 和短信验证码哪个安全?

TOTP 更安全。短信可能被 SIM 卡劫持、被拦截,TOTP 在本地生成、不经过运营商。条件允许的话,所有支持 TOTP 的账号都建议从短信验证切到验证器。

手机丢了、没备份,还能找回吗?

只能找网站客服走身份验证流程,通常很慢,有的平台直接无法恢复。所以现在就去把恢复码备份好。

总结

  • TOTP = 密钥 + 时间算出来的 6 位数,密钥就是一切
  • 临时在电脑上拿码,可以用 otp.tbbbk.com 这类本地计算的在线工具;重要账号用 App
  • 选支持导出的验证器,换机前先导出
  • 恢复码 + 密钥原文 + 第二设备,至少备份两样

需要一个美国手机号来开短信验证的话,可以看 Tello 注册教程。