> ## Content Index
> Fetch the complete content index at: https://tbbbk.com/llms.txt
> Use this file to discover other available public pages before exploring further.

# TOTP 是什么？在线生成 2FA 验证码、换机迁移和备份完整指南
- URL: https://tbbbk.com/totp-2fa-guide/
- Published: 2026-10-22T03:59:18.000Z
- Updated: 2026-10-22T03:59:18.000Z
- Description: TOTP 验证码的原理、在线生成方法、验证器怎么选、换机怎么迁移、怎么备份才不会把自己锁在门外。
- Author: TuBaiBai
- Tags: 手机号与验证码, 折腾日记, 教程

登录 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）**](https://otp.tbbbk.com/)

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

验证码是在你的浏览器里用 JavaScript 本地计算的，代码开源在 [GitHub](https://github.com/AnYanYi/TotpG)，可以自己检查。如果你想把某个验证码分享给别人自助获取，可以看我之前写的[自助验证码工具改造记录](https://tbbbk.com/self-hosted-2fa-web-tool/)。

### 用在线生成器要注意什么

- **只用本地计算、代码可查的工具**。不明来历的网站完全可能把你输入的密钥偷偷发到服务器
- **重要账号（邮箱、银行、交易所）别用在线工具**，老老实实用验证器 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 Authenticator    | iOS / Android | 可登录 Google 账号云同步；也能导出二维码    | 大多数人      |
| Microsoft Authenticator | iOS / Android | 微软账号云备份                     | 用微软全家桶的   |
| 2FAS                    | iOS / Android | 开源，iCloud / Google Drive 备份 | 想要开源又好用   |
| Aegis                   | Android       | 开源，本地加密备份文件                 | 注重隐私的安卓用户 |
| 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](https://otp.tbbbk.com/) 这类本地计算的在线工具；重要账号用 App
- 选支持导出的验证器，换机前先导出
- 恢复码 + 密钥原文 + 第二设备，至少备份两样

需要一个美国手机号来开短信验证的话，可以看 [Tello 注册教程](https://tbbbk.com/tello-esim-registration-guide/)。