全部文章

2FA 密钥使用教程:从密钥生成验证码到登录账号

如果你已经拿到一串 2FA 密钥,通常不是把这串密钥直接填进网站的验证码输入框。正确的做法是先用支持 TOTP 的验证器根据密钥生成当前验证码,再把这组短验证码填回需要进行二次验证的网站。

本文另有 English

2FA 密钥使用教程:从密钥生成验证码到登录账号

例如你手里有:

一套常见的登录资料
账号:user@example.com
密码:********
2FA:JBSWY3DPEHPK3PXP

前两项用于正常登录。第三项通常是给验证器使用的 Secret:先用它生成当前验证码,等网站要求二次验证时,再填写生成出来的数字。

已经有 Base32 密钥的话,可以直接用 2FA 验证码生成器 查看当前验证码。

已经拿到 2FA 密钥,应该怎么用

最常见的 TOTP(基于时间的一次性密码)登录流程是这样的:

从密钥到登录
账号 / 邮箱
      +
    密码
      ↓
完成第一步登录
      ↓
网站要求输入 2FA 验证码
      ↓
把 2FA Secret 放进验证器
      ↓
生成当前动态验证码
      ↓
把验证码填回网站
      ↓
完成验证

这里最容易弄错的一点,是把 Secret 和验证码当成同一个东西。它们不是一回事。

假设你的 2FA Secret 是:

JBSWY3DPEHPK3PXP

验证器根据它和当前时间,可能生成:

384921

过一段时间又会变成另一组数字。前面的长字符串是生成验证码使用的密钥,后面的短数字才是登录页面通常要求填写的动态验证码。

先分清你拿到的是哪一种东西

用户第一次接触 2FA 时,真正麻烦的往往不是生成验证码,而是不知道自己手里的东西是什么。可以先按下面的方法判断。

几种看起来都像「验证码」的东西,用途完全不同。
你拿到的内容通常是什么应该怎么用
JBSWY3DPEHPK3PXP 一类字符串Base32 / TOTP Secret放进支持 TOTP 的验证器
otpauth://totp/...验证器配置 URI导入支持该格式的验证器
二维码2FA 配置信息用验证器扫描
384921 一类短数字当前动态验证码填入网站的 2FA 验证框
Recovery Code / Backup Code恢复码按平台指定的恢复流程使用
邮件或短信收到的验证码邮件 / SMS OTP直接填写,不需要 TOTP Secret

如果你看到的是一串比较长的字母和数字,而且资料里明确标着 2FA、Secret、Secret Key、Setup Key、TOTP Secret 或 Authenticator Key,那它很可能是用于生成动态验证码的密钥。

如果仍然分不清,可以先看2FA 密钥是什么,再回来操作。

用 2FA 密钥生成验证码

已经确认手里的是 TOTP Secret 后,就需要一个支持 TOTP 的验证器。可以用手机上的 Authenticator App,也可以用支持同一套标准的工具。

在 EnvTrace 里,流程是:

  1. 打开 2FA 验证码生成器。
  2. 把 Base32 密钥粘贴到输入框。
  3. 生成当前验证码。
  4. 复制验证码。
  5. 返回正在登录的网站。
  6. 把验证码填入 2FA 或 Authentication Code 输入框。

当前工具页也支持 otpauth:// 格式。如果你拿到的不是单独的 Base32 Secret,而是一整条验证器配置内容,不一定需要手动把 Secret 从中拆出来。

TOTP 的验证码和时间有关。RFC 6238 推荐的默认时间步长是 30 秒,因此很多常见验证器都会看到验证码周期性更新。如果当前验证码已经接近这一周期的末尾,而你还需要切换页面、复制和提交,等下一组验证码再输入通常更稳妥。

登录账号时,2FA 验证码填在哪里

2FA 通常发生在密码之后。

以一个使用账号密码和 TOTP 的网站为例,第一次看到的可能是:

Email
Password

填写完成后,网站再出现:

Authentication Code

或者:

Two-Factor Authentication
Enter your 6-digit code

这时要求的通常不是原始 Secret。应该打开验证器,根据对应账号的 Secret 找到当前动态验证码,再把短验证码填进去。

GitHub 的 TOTP 设置就是类似的逻辑:用户可以扫描二维码,也可以查看 Setup Key 手动添加到 TOTP 应用,然后把验证器生成的验证码填写回 GitHub。X 等服务在使用认证应用作为 2FA 时,也采用相似的登录方式:验证器生成验证码,网站在登录过程中要求用户输入。

具体按钮名称会因平台而不同,但 Secret 用于配置验证器,动态验证码用于完成登录,这两个角色不要弄反。

如果拿到的是一整套账号资料

有些情况下,你接手自己拥有或被授权管理的账号时,收到的并不只是用户名和密码,而是一整组登录资料。例如:

一整套登录资料
Username: example
Password: ********
Email: example@email.com
2FA: JBSWY3DPEHPK3PXP
Recovery Code: XXXXXXXX

可以这样理解:

Username / Email

这是第一步登录时使用的账号标识。

Password

正常的账户密码。

2FA / Secret

如果它是一串 TOTP Secret,需要先放进验证器生成动态验证码。

Recovery Code

这是备用恢复凭据。只有正常 2FA 方法不可用、并且目标平台允许使用恢复码时才使用。它不是日常生成验证码的 Secret。

真正的登录顺序通常仍然是:账号 → 密码 → 2FA 验证 → 当前验证码。

如果你只是获得了一个 2FA Secret,却没有该账号的合法访问权限,Secret 本身不应该被用来尝试访问别人的账号。

二维码和 otpauth:// 应该怎么用

开启 TOTP 2FA 时,网站经常不会先给你看一串 Secret,而是显示一个二维码。这是因为二维码更方便。其中通常包含类似下面这样的配置:

二维码里的实际内容
otpauth://totp/Example:user@example.com?secret=JBSWY3DPEHPK3PXP&issuer=Example

这里真正参与生成验证码的 Secret 是:

JBSWY3DPEHPK3PXP

但 otpauth:// 还可以带上 TOTP 类型、账号名称、服务商名称、Secret、验证码位数、算法和时间周期。

所以二维码、otpauth:// 和 Base32 Secret 不是三套完全不同的 2FA。很多时候,它们只是同一套 TOTP 配置信息的不同表现形式:二维码方便扫描,otpauth:// 方便程序导入,Base32 Secret 适合手动输入。

想弄清验证码为什么会每 30 秒变一次,可以看TOTP 验证码是什么。

为什么有了 2FA 密钥,验证码还是不对

如果 Secret 能正常生成验证码,但网站一直提示错误,问题通常已经不是「怎么使用密钥」了。先检查几个最常见的地方。

账号是不是对应的

如果你同时管理多个账号,很容易拿错 Secret。Secret 和账号必须对应。

Secret 是否已经失效

账号重新绑定或重置过 2FA 后,旧的 Secret 可能已经无法继续验证。验证器仍然可以根据旧 Secret 算出数字,但服务器保存的已经是另一套 Secret,所以双方不会匹配。

时间是否正确

TOTP 依赖双方对当前时间的计算。设备时间偏差过大,生成的验证码可能落在错误的时间窗口里。

验证码是不是刚好过期

如果只剩很短时间才复制验证码,等你切回网站并提交时,它可能已经进入下一周期。

这个 2FA 是否真的是标准 TOTP

2FA 是一个更大的概念。短信验证码、邮件验证码、推送确认、Passkey、硬件安全密钥都可以参与多因素认证。并不是看到「2FA」三个字,就代表一定可以拿一个 Base32 Secret 生成验证码。

如果你已经确认 Secret 正确,但验证码仍然持续被拒绝,继续看2FA 验证码无效怎么办。

恢复码、短信验证码和 2FA 密钥不是一回事

这一点单独强调,是因为几种东西看起来都像「登录时额外需要的一串字符」。

2FA Secret

用于持续生成 TOTP 验证码。通常长期保存。

TOTP 验证码

根据 Secret 和当前时间生成。有效时间很短。

Backup Code / Recovery Code

平台预先提供的备用登录凭据。例如 Google 的 Backup Code 在使用后会失效,并且生成一套新的 Backup Codes 后,旧的一套也会失效。

短信 / 邮件验证码

由平台通过短信或邮件发送。EnvTrace 不能通过一个 TOTP Secret 推算出网站发给你的短信或邮件验证码,因为它们不是同一个机制。

所以,看到登录页面要求「验证码」时,不要只看这三个字。先看网站当前要求的是 Authenticator Code、SMS Code、Email Code、Recovery Code,还是其他验证方式。

什么时候不要继续反复尝试

如果验证码连续多次被拒绝,不要只是一遍遍生成新的数字继续输入。先确认:

  1. Secret 是否属于当前账号。
  2. 账号是否重新绑定过 2FA。
  3. 系统时间是否正确。
  4. 当前验证方式是不是 TOTP。
  5. 是否还有恢复码或其他已绑定的验证方式。

如果你确定拿到的只是一个旧 Secret,或者账号已经重新配置过验证器,继续生成验证码不会把旧密钥变成正确的。这时应该回到账号所属平台,通过正常的 2FA 重置、恢复码或账号恢复流程解决。

如果你已经确认手里的就是当前有效的 Base32 Secret,可以先用 2FA 验证码生成器 生成当前 TOTP,再完成网站要求的二次验证。

常见问题

2FA 密钥怎么用?
如果是 TOTP 类型的 2FA 密钥,先把它导入支持 TOTP 的验证器,由验证器生成当前动态验证码。登录网站时,账号和密码仍然正常填写,网站要求二次验证后再输入这组短验证码。
2FA 密钥应该直接填到验证码输入框吗?
通常不应该。2FA Secret 或 Setup Key 是生成验证码用的长期密钥。网站登录页通常要的是根据密钥算出来的短期动态验证码,不是 Secret 本身。
2FA 密钥和 6 位验证码有什么区别?
2FA 密钥通常长期不变,用来持续计算 TOTP 验证码。常见的 6 位验证码是短期结果,会随时间窗口变化。两者不能混用。
otpauth:// 是 2FA 密钥吗?
otpauth:// 是用来配置验证器的 URI,里面可以包含 TOTP Secret、账号名称、服务商和验证码参数。它不只是单独一串 Secret,但验证器可以从中读出生成验证码所需的信息。
恢复码可以放进 2FA 验证器吗?
通常不可以。Recovery Code 或 Backup Code 是账号提供的备用登录凭据,不是用来持续生成 TOTP 验证码的 Secret。两者用途不同。

用密钥生成当前验证码

粘贴 Base32 密钥或 otpauth:// 链接,立刻得到 6 位验证码。

打开 2FA 验证码生成器→
继续阅读

相关文章