TOTP 是什么?在线生成 2FA 验证码、换机迁移和备份完整指南
登录 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 本身不重要,密钥才是关键。
验证码是怎么算出来的
不用懂密码学也能看明白,计算分三步:
- 算时间片:当前 Unix 时间戳除以 30,取整数。也就是说每 30 秒是一个"时间片",同一个时间片里算出来的码都一样
- 算 HMAC:用密钥对这个时间片数字做 HMAC-SHA1,得到一串 20 字节的哈希
- 截取成 6 位:从哈希里按规则截出 4 个字节,转成整数,再对 1000000 取余,不足 6 位前面补 0
整个过程只需要密钥和时间,不需要联网。这也是为什么飞行模式下验证器照样能用。
大多数网站用的都是默认参数:SHA1 算法、6 位数字、30 秒周期。少数服务会用 8 位或 60 秒,绑定时二维码里会写明。
怎么在线生成 TOTP 验证码
手边没有手机、或者想在电脑上直接拿码,可以用在线 TOTP 生成器。我自己维护了一个:
- 打开页面,把密钥粘贴到 "Secret Key" 输入框(空格和大小写不影响)
- 位数和周期一般保持默认的 6 位、30 秒
- 页面会实时显示当前验证码和剩余秒数,环形进度条走完就会自动换下一个
验证码是在你的浏览器里用 JavaScript 本地计算的,代码开源在 GitHub,可以自己检查。如果你想把某个验证码分享给别人自助获取,可以看我之前写的自助验证码工具改造记录。
用在线生成器要注意什么
- 只用本地计算、代码可查的工具。不明来历的网站完全可能把你输入的密钥偷偷发到服务器
- 重要账号(邮箱、银行、交易所)别用在线工具,老老实实用验证器 App
- 带密钥的链接等于密钥本身:密钥一旦出现在网址里,就会留在浏览器历史记录里,发给别人等于把账号的第二道锁交出去了
在电脑上生成:命令行和 Python
折腾党可以直接在终端里算。Linux / macOS 装个 oathtool:
# Debian / Ubuntu
sudo apt install oathtool
# macOS
brew install oath-toolkit
oathtool --totp -b JBSWY3DPEHPK3PXPPython 用 pyotp 两行搞定:
pip install pyotp
python -c "import pyotp; print(pyotp.TOTP('JBSWY3DPEHPK3PXP').now())"把密钥换成你自己的就行。写脚本自动登录、做服务器运维的时候很好用。
验证器 App 怎么选
| App | 平台 | 备份 / 同步 | 适合 |
|---|---|---|---|
| Google Authenticator | iOS / Android | 可登录 Google 账号云同步;也能导出二维码 | 大多数人 |
| Microsoft Authenticator | iOS / Android | 微软账号云备份 | 用微软全家桶的 |
| 2FAS | iOS / Android | 开源,iCloud / Google Drive 备份 | 想要开源又好用 |
| Aegis | Android | 开源,本地加密备份文件 | 注重隐私的安卓用户 |
| Ente Auth | 全平台(含桌面) | 开源,端到端加密同步 | 手机电脑都要用 |
我的建议:选一个支持导出的。最怕的就是验证码全锁在一个 App 里、换机导不出来。
换手机怎么迁移
以 Google Authenticator 为例:
- 旧手机打开 Google Authenticator → 右上角菜单 → 转移账号 → 导出账号
- 勾选要迁移的账号,会生成一个或几个二维码
- 新手机装好 Google Authenticator → 扫描二维码,扫旧手机上的码
- 新手机上逐个登录确认验证码能用之后,再删旧手机上的数据
如果开了 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=30secret= 后面那串就是密钥。所以二维码截图也要当密码一样保管。
TOTP 和短信验证码哪个安全?
TOTP 更安全。短信可能被 SIM 卡劫持、被拦截,TOTP 在本地生成、不经过运营商。条件允许的话,所有支持 TOTP 的账号都建议从短信验证切到验证器。
手机丢了、没备份,还能找回吗?
只能找网站客服走身份验证流程,通常很慢,有的平台直接无法恢复。所以现在就去把恢复码备份好。
总结
- TOTP = 密钥 + 时间算出来的 6 位数,密钥就是一切
- 临时在电脑上拿码,可以用 otp.tbbbk.com 这类本地计算的在线工具;重要账号用 App
- 选支持导出的验证器,换机前先导出
- 恢复码 + 密钥原文 + 第二设备,至少备份两样
需要一个美国手机号来开短信验证的话,可以看 Tello 注册教程。