详解
什么是 2FA?那些每 30 秒一换的验证码,究竟是怎么算出来的?
一份完整而通俗的指南:双重验证到底是什么,6 位 TOTP 验证码背后的加密技术, 哪个账户该开启哪种因素,以及如何永远不被锁在门外。
为什么只用密码不行
每次登录都需要密码,而密码有三个结构性问题:它们会被复用,会被撞库攻击拿泄露 数据库去猜,也会被人从你嘴里骗走。双重验证(2FA)接受一个简单的事实—— 人是最低一环——并补上一个攻击者必须同时掌握、彼此独立的第二样东西。开启 2FA 后, 泄露的密码本身不再足以进入你的账户。
如今多数主流服务要么提供要么强制 2FA:GitHub 从 2023 年起强制执行,加密交易所 (Binance、Coinbase、Kraken)每逢行情大跌就催你开启,Microsoft、Google 和 Apple 已把它作为账户安全的默认选项。
三种认证因素
认证因素分为三类:
- 你知道的东西——密码、PIN。部署便宜,但容易钓鱼。
- 你拥有的东西——生成验证码的验证器、硬件安全密钥或通行密钥、 收短信的手机。2FA 主要活在这一层。
- 你本身是什么——指纹、人脸。很方便,但它是设备端注册的,而不是远程认证的主力因素。
真正的双重验证要组合来自两个不同类别的技术。密码+手机解锁图案不是 2FA; 密码+轮换的验证器验证码才是。
TOTP 如何工作,一步步拆解
- 注册。你为一个服务开启 2FA 时,它生成一个随机密钥并只与你 共享一次——画成二维码,或以 Base32 设置密钥的形式显示。从安全角度看,正是这一刻 承担了全部风险,所以你应该只在值得信任的地方展示它。
- 时间开始走。当前时间被切成 30 秒一档的“步”:
step = floor(unixTime / 30)。30 没有什么特别;RFC 6238 允许服务接受 15、30 或 60 秒。 - HMAC。你的验证器以密钥为键,对步值计算 HMAC 哈希 (大多数服务用 SHA-1,偶尔 SHA-256/512)。HMAC 是单向构造:看到结果 推不出关于密钥的任何信息。
- 取位。从 HMAC 输出中按最后一个半字节(nibble)选出 4 个字节, 清除最高位,所得结果对 10n 取模就是你的验证码——通常
n= 6,偶尔是 7 或 8 位。 - 验证窗口。服务器对当前步和上一步重新计算同样的值(以容忍轻微的 时钟偏差)。匹配的证明被接受为登录。
以上全部在几微秒内、完全在你的设备上完成。正因如此,2FA COUNTER这样的客户端工具才能在本地完成整个工作——打开页面、断开网络,验证码照样 每 30 秒流出,永远。
密钥与二维码
Base32 字符串并不是什么中间格式——它就是密钥的原始字节,用一套对手机友好的字母表 (A–Z 加 2–7,刻意排除容易混淆的 0/1,在任何键盘上都安全)编码而成。当平台给出 “无法扫码?”选项时,显示的字符串里装着二维码所编码的同一份私密材料。 两种形式存哪个都行;语义完全相同:
otpauth://totp/GitHub:you%40example.com?secret=JBSWY3DPEHPK3PXP&issuer=GitHub
otpauth://totp/Binance:me?secret=JBSWY3DPEHPK3PXP&digits=6&period=30&algorithm=SHA1
otpauth://hotp/Steam:sda?secret=...&counter=5 ← 基于计数器的(HOTP)变体一个现代化的生成器会尊重每一个参数:位数、周期、哈希算法和 HOTP 计数器——因为一个 指定 SHA-256 的服务依然会拒绝按默认 SHA-1 生成的验证码。一段裸 Base32 密钥的默认值 是 6 位、30 秒、SHA-1,这正是绝大多数服务使用的配置。
TOTP vs. 短信 vs. 硬件密钥
- 短信验证码横穿电信网络。SIM 卡劫持攻击能让对手夺走你的号码、收走每一条验证码。美国标准(NIST SP 800-63B)已经不再推荐用短信做认证。
- TOTP 不发送任何东西——验证码在本地计算,30 秒即作废。免费、有标准背书、到处都支持。薄弱环节:在有效期窗口内可能被钓走。
- 安全密钥与通行密钥(WebAuthn/FIDO2)与精确的域名加密绑定,仿冒的相似网站自动失效。最强选项;支持范围较小,且要花钱买密钥。
实用的阶梯:非必要不用短信,默认用 TOTP,最重要的账户上硬件密钥或通行密钥。
想深挖这些取舍,我们另有专题文章: TOTP vs. 通行密钥——哪种因素该放在哪里、 SIM 卡劫持如何击破短信验证码,以及 应用的云同步会给你的密钥带来什么。
2FA 防不了什么
双重验证解决的是密码被盗。它防不住会话 Cookie 被窃(已经潜伏在你机器上的 恶意软件)、权限过大的浏览器扩展、已经失控的恢复邮箱,也拦不住一种社会工程: 骗子在 30 秒有效期内催你把新验证码念给他听。保持浏览器更新、果断清理扩展, 把任何慌里慌张索要验证码的请求当作它应有的那面红旗。
如何永远不被锁在门外
- 保存备用代码。每个服务在被你开启 2FA 时都会打印一组一次性恢复代码。 打印出来,或者加密后离线保存。
- 留下密钥本身,而不只是工具。把 Base32 密钥写进密码管理器的金库里, 你就能用任何验证器——手机应用,或者浏览器里的生成器—— 在当天真正可用的那台设备上重新生成验证码。
- 注册两台设备,而不是一台。把密钥同时放在两台可信设备上是安全的。 TOTP 是确定性的:同一密钥,同一验证码。
- 管好自己的时钟。如果验证码总是被拒,先修设备的时钟同步——这是 “验证码无效”错误最常见的原因,任何工具都绕不过去。
常见问题
什么是 2FA?
2FA(双重验证)是指用两种不同的凭证证明“你是你”:你“知道”的东西(密码)加上你“拥有”的东西(每 30 秒变化一次的验证码、安全密钥或手机)。密码本身可能泄露或被猜中;有了第二重因素,泄露的密码单凭自身就无法打开你的账户。
2FA 为什么如此重要?
因为密码一直在被攻破。数十亿个真实密码已经随数据泄露事件公开,攻击者昼夜不停地用它们登录别人的账户(撞库攻击)。据微软报告,2FA 能挡住超过 99.9% 的自动化账户接管攻击——它保护的正是你的邮箱、网银、社交媒体、游戏和加密资产账户中最真实发生的那类威胁。
2FA 用在哪些地方?
凡是值得偷的登录入口它都能保护:邮箱和云服务(Google、Microsoft、Apple)、银行与金融、加密货币交易所(Binance、Coinbase、Kraken)、开发者平台(GitHub、AWS)、游戏(Steam、Discord、Twitch)、社交媒体(X、Instagram)。企业也用它保护 VPN、邮箱和管理后台。只要某项服务提供“身份验证器应用”选项,2FA 就是正确的工具。
2FA 是怎么工作的?
你输入密码之后,服务会要求第二重证明。以最常用的方式(TOTP)为例:你的验证器用“共享密钥+当前时间”算出一个新鲜的 6 位验证码(RFC 6238 标准),服务器上独立完成同样的计算并比对结果。验证码每 30 秒轮换一次、用过即作废,所以手握你密码的攻击者依然进不去。
TOTP 验证码是怎么生成的?
网站给你一个密钥(通常以二维码或 Base32 字符串的形式)。你的验证器以该密钥为锁,对当前这个 30 秒时间窗口计算 HMAC(多数服务用 SHA-1,偶尔 SHA-256/SHA-512),再从结果中读出 6 位数字。网站执行完全相同的计算并比对。因为双方早已共享密钥,全程不需要联网。
如何获取 2FA?
就在你想保护的那个账户里获取:打开其设置,找到“安全”或“登录与安全”,再找“双重验证”或“两步验证”。选择身份验证器应用选项,扫描二维码(或显示设置密钥),然后输入验证器里显示的验证码完成确认。想了解不用手机拿码的完整流程,请看分步教程 /zh-cn/how-to-get-2fa-code/。
如何开启 2FA?
四步:1) 打开服务的账户或安全设置,选择“双重验证”。2) 选择“使用身份验证器应用”(能避开短信就避开)。3) 用验证器扫描二维码——或者点“无法扫码?”并保存设置密钥。4) 输入当前验证码完成设置,然后下载或打印它显示的备用/恢复代码。我们在 /guides/ 发布了 Google、GitHub、Discord、Binance 等服务的分步指南。
2FA 有多强?
取决于你用哪种第二重因素。短信验证码最弱——SIM 卡劫持可以夺走你的号码并截走所有验证码。TOTP 验证码(每 30 秒一换的那种)在计算上很稳固:离线攻击者推导不出来,而且实时验证码几秒内即失效。硬件安全密钥和通行密钥(passkey)最强,因为它们抗钓鱼,并与真实网站加密绑定。
2FA 100% 安全吗?
没有任何安全措施能到 100%,诚实的 2FA 指南都会这么说。2FA 能废掉被盗的密码,但验证码本身仍可能被钓走:只要你在 30 秒有效期内把新验证码输进假网站;已经运行在你设备上的恶意软件可以偷走会话;而如果短信是你的第二重因素,SIM 卡劫持就是现实威胁。话虽如此,开启 2FA 仍会让你比只用密码时难攻破得多。
2FA 是强制的吗?
法律上还没有,但越来越多的服务把它变成强制:GitHub 从 2023 年起要求代码贡献者必须开启,许多银行和加密货币交易所默认强制,用人单位也常把它作为工作登录的要求。其他地方它虽然可选,但强烈建议开启。实际操作中,请把你最重要的账户都当作必须开启 2FA:先是邮箱——因为收件箱被劫持后,其他一切密码都能被重置。
为什么现在到处都要 2FA?
因为只用密码的时代彻底失败了。大规模泄露把数十亿凭据晒在明处,撞库攻击被自动化到几乎零成本,平台也开始为被劫持的账户买单。监管同样在推:美国国家标准 NIST 已将短信认证降级为不推荐,欧盟 PSD2 规则要求强客户认证。几家巨头把 2FA 变成常态后,其余服务跟进是自然潮流。
TOTP、HOTP 和 OTP 有什么区别?
OTP 只是“一次性密码”的统称。TOTP(基于时间的 OTP,RFC 6238)用当前时间推算验证码,所以每 30 秒更换。HOTP(RFC 4226)基于计数器:每个验证码用一次,计数器随之加一。几乎所有“身份验证器应用”类型的服务——Google、Microsoft、Discord、GitHub——都用 TOTP。
为什么 TOTP 比短信 2FA 好?
短信验证码经过电话网络传输,可能被拦截或通过 SIM 卡劫持窃取——而且短信本身就可能送不到。TOTP 验证码在你的设备上计算,从不外发,几秒内过期。包括 NIST 在内的安全机构已不再推荐把短信用于认证。
TOTP 验证码会被钓鱼网站偷走吗?
会——只要你在 30 秒有效期内把一个新验证码输进钓鱼页面,攻击者就得到了一次可用的登录。这正是抗钓鱼因素(硬件安全密钥和通行密钥,它们与真实域名加密绑定)在支持的服务上最强的原因。TOTP 赢的是短信和密码,不是硬件密钥。
2FA 密钥应该存在哪里?
存在密码管理器的加密金库里,作为你的母本。这样即使手机不在手边,你也能在任何可信设备上重新生成验证码——包括在浏览器里用 2facounter.com 这类工具。同时务必保存每个服务在开启 2FA 时给出的恢复/备用代码;那才是你真正的安全气囊。