全部文章

2FA 密钥是什么?在哪里找到两步验证密钥

开启两步验证时,平台会给出一串大写字母和数字,比如 JBSWY3DPEHPK3PXP。这串字符是 2FA 密钥,验证器靠它算出每 30 秒变一次的 6 位验证码。

本文另有 English

2FA 密钥是什么?在哪里找到两步验证密钥

2FA 密钥是什么

2FA 密钥是你和平台之间共享的一串字符,长这样:

典型的 2FA 密钥
JBSWY3DPEHPK3PXP

它的作用只有一个:让验证器算出当前那个 6 位验证码。平台自己也存着同一串字符,所以它能算出同样的结果,用来核对你输入的码对不对。

密钥是长期有效的。只要你不关掉两步验证、不重新绑定,这串字符一直不变。变的是它算出来的验证码。

为什么开启两步验证时会出现一串密钥

两步验证要解决的是「光有密码不够」。平台需要第二个证据,证明操作的人手上有某个特定的东西。

短信验证码用手机号当这个东西,代价是每次都得联网收短信。验证器 App 换了个思路:一开始就把一串随机字符同时交给你和平台,之后双方各自用它算码,谁都不用再传递什么。

那一串随机字符就是密钥。它只在开启的那一刻出现一次,因为它只需要交接一次。

Secret Key、Setup Key、2FA Secret 是同一个东西吗

是。不同平台对同一样东西用了不同叫法:

  • Secret / Secret Key
  • Setup Key / Setup Code
  • 2FA Secret / TOTP Secret
  • 密钥 / 设置密钥 / 手动输入代码

只要它是一串 16 到 32 个大写字母和数字、只含 A–Z 和 2–7,那就是同一个东西,可以互相替换使用。

要区分开的是恢复码(Recovery Code / Backup Code)。恢复码通常是 8 到 10 位、一次性、给一整组,用于丢了验证器时找回账号。它不能用来生成验证码。

为什么密钥长成 Base32 那样

密钥本质是一串随机字节。字节没法直接让人抄写,所以要编码成可读字符,这里用的编码方式叫 Base32。

Base32 的字符表是 A–Z 加 2–7,一共 32 个符号。数字 0、1、8、9 和字母 O、I、L 都不在里面——因为 0 和 O、1 和 I 或 l 手抄时太容易认错。这是个为「人要自己录入」而做的取舍。

所以如果你手上的密钥里出现了 0、1、8、9 或者小写字母,先怀疑是抄错或者复制多了字符。小写字母的情况稍微特殊:Base32 不区分大小写,jbswy3dp 和 JBSWY3DP 是同一把密钥,工具通常会自动转成大写。

二维码里装的就是这串密钥

扫码和手动输入密钥,做的是同一件事。

二维码只是一种把文字变成图案的方式,本身没有加密。开启两步验证时那张二维码里存的是一段文本,密钥就明文写在里面。扫码之所以省事,是因为省掉了手抄 16 个字符的过程,不是因为它更安全。

反过来说,那张二维码的截图和密钥本身一样敏感。任何人扫到它,就拿到了你的密钥。

otpauth:// 链接是什么

二维码里的那段文本,格式是这样:

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

这叫 otpauth 链接,是验证器之间通用的格式。拆开看:

  • totp —— 用的是基于时间的算法(另一种 hotp 基于计数器,很少见)
  • Facebook:zhang@example.com —— 显示在验证器列表里的名字,只影响你自己看得清不清
  • secret=JBSWY3DPEHPK3PXP —— 密钥本体
  • issuer=Facebook —— 平台名

有些平台还会带上 algorithm、digits、period 三个参数,表示它不用默认的 SHA-1、6 位、30 秒。这种情况少见,但一旦出现,只复制 secret 的值就不够了,得把整条链接一起用,否则算出来的码对不上。

一个实用结论:能拿到整条 otpauth 链接时,优先用链接,因为它把参数一起带上了。

各平台在哪一步给出密钥

路径各不相同,但节点是一样的:走到「扫描二维码」那一屏,找一个让你不扫码的入口。

常见入口的叫法。看到其中任何一个,点进去就能看到密钥。
界面上的字样语境
无法扫描二维码?Google、GitHub 等
手动输入 / 手动设置Facebook、Microsoft 等
输入密钥 / 输入代码多数中文界面
Can’t scan the QR code?英文界面通用
Enter this key manually / Setup key英文界面通用

点进去之后,页面会把密钥以纯文本显示出来,通常还带一个复制按钮。有些平台为了方便阅读会每 4 个字符空一格,像 JBSW Y3DP EHPK 3PXP——空格不是密钥的一部分,粘贴时带上也没关系,工具会去掉。

买来的账号是另一种情况:密钥通常已经和账号密码写在一起给你了,字段名可能叫 2FA、密钥、验证码密钥或者一串裸的 Base32。

为什么有的网站只给二维码

因为它假设你用手机扫。产品设计上,扫码是主路径,手动输入是给「相机坏了」这类情况准备的后备入口,所以藏得比较深,有时候要点两层才出来。

也有平台确实不提供明文密钥。遇到这种,可行的办法是用手机上的二维码识别功能对着屏幕上那张图识别一次——识别结果就是上面那条 otpauth 链接,密钥在 secret= 后面。

密钥和 6 位验证码的区别

两者用途完全不同,泄露的后果也不同。
2FA 密钥6 位验证码
长度16–32 个字符6 位数字
有效期长期,不主动更换就不变30 秒
出现次数开启两步验证时一次每次登录都要一个新的
泄露的后果对方可以一直生成有效验证码30 秒后自然失效

这张表说明了一件事:验证码被人看到一眼,风险有限;密钥被人拿到,等于两步验证对他不再是障碍。

想弄清 6 位验证码具体是怎么从密钥算出来的,可以看TOTP 验证码是什么。

密钥必须像密码一样保管

密钥是长期凭证,按密码的标准对待它:

  • 存进密码管理器,或者存进本身有加密的笔记,不要留在聊天记录、待办清单、桌面 txt 里。
  • 二维码截图和密钥同等敏感,别留在相册和图床里。
  • 关掉两步验证再重新开启,平台会发一把新密钥,旧的立刻作废——怀疑泄露时这是最直接的处理方式。
  • 密钥丢了,验证码就再也算不出来。所以开启的时候顺手把恢复码也存下来,它是密钥丢失后唯一的退路。

多账号运营的场景下,密钥数量会很快堆起来。把它们和账号一一对应地存好,比事后逐个试要省事得多。

拿到密钥之后

手上有密钥就可以直接出码了,不一定要先装 App。完整登录顺序——账号、密码、密钥、验证码各自填在哪——见2FA 密钥使用教程。

把密钥粘贴进 2FA 验证码生成器,页面会立刻给出当前的 6 位验证码和剩余秒数。多个账号就一行一个密钥,每行前面可以写备注,比如 FB-01: JBSWY3DPEHPK3PXP,出码时按备注区分。

验证码在浏览器本地算出来,EnvTrace 不会把密钥发到服务器,也不会存下来。这适合临时登录和核对;长期日常使用还是建议同时放进手机验证器,手机不在身边时再用网页版。

如果生成出来的码平台不认,先看2FA 验证码无效怎么办——绝大多数情况是设备时间差了几十秒,或者密钥少复制了一个字符。

常见问题

2FA 密钥和 6 位验证码是同一个东西吗?
不是。密钥是一串长期不变的字符,只在开启两步验证时出现一次。6 位验证码由密钥和当前时间算出来,每 30 秒换一个。
2FA 密钥一般有多长?
常见是 16 个或 32 个字符,只含 A–Z 和 2–7。有些平台会每 4 个字符空一格显示,空格不属于密钥本身。
只扫了二维码,没记下密钥,还能拿回来吗?
多数平台开启完成后不再显示密钥。想拿到明文密钥,通常要关掉两步验证再重新开启一次,在扫码那一步选择手动输入。
同一把 2FA 密钥可以在两个地方同时用吗?
可以。密钥相同、时间相同,算出的验证码就相同,所以同一把密钥能同时放进手机验证器和电脑上的工具。这也意味着拿到密钥的人都能生成有效验证码。

用密钥生成当前验证码

粘贴 Base32 密钥,立刻得到 6 位验证码,每 30 秒刷新。

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

相关文章