什么是两步验证 - 仅靠密码无法保护账户的原因
密码依赖于"知识"这一单一要素。无论设置多么复杂的密码,一旦被钓鱼攻击窃取,就会瞬间被突破。两步验证 (2FA) 在密码之外加入"持有物"或"生物特征"等不同要素,即使密码泄露也能防止未授权访问。
认证的三大要素如下:
- 知识要素:密码、PIN、安全问题等"你知道的东西"
- 持有要素:智能手机、安全密钥、IC 卡等"你拥有的东西"
- 生物要素:指纹、面部识别、虹膜等"你的身体特征"
两步验证将其中两种以上要素组合使用。严格来说,"双因素认证 (2FA)"和"两步验证"是不同的概念,但在日常使用中几乎被当作同义词。详情请参阅双因素认证详解。
短信验证 - 便捷但存在漏洞的方式
短信验证是在登录时向手机号码发送 6 位左右的一次性验证码,要求用户输入该验证码的方式。由于无需额外安装应用,部署简单,因此被许多服务采用。
然而,短信验证存在严重的安全漏洞。
- SIM 卡劫持:攻击者欺骗运营商,将受害者的手机号码转移到另一张 SIM 卡上。详情请参阅 SIM 卡劫持详解
- SS7 协议漏洞:电话网络的基础协议 SS7 存在设计缺陷,技术上可以拦截短信
- 钓鱼实时中继:攻击者在伪造网站上让受害者输入验证码,并实时转发到正规网站 (Adversary-in-the-Middle)
- 恶意软件读取短信:Android 设备上的恶意软件利用短信读取权限窃取验证码
NIST(美国国家标准与技术研究院)在 2016 年的 SP 800-63B 中将短信验证定位为"受限"的认证手段,建议迁移到更安全的方式。短信验证"聊胜于无",但对于需要高安全性的账户来说是不够的。
认证应用 - TOTP 的工作原理与推荐应用
认证应用基于 TOTP(基于时间的一次性密码)算法,每 30 秒生成一个新的 6 位验证码。服务器和应用共享同一个密钥(种子),通过当前时间和密钥计算 HMAC-SHA1 哈希值来生成验证码。
TOTP 的技术流程如下:
- 注册服务时,服务器生成密钥并以二维码形式显示
- 认证应用扫描二维码,将密钥保存在本地
- 登录时,应用使用"密钥 + 当前 UNIX 时间戳(30 秒为单位)"计算 HMAC-SHA1
- 从哈希值中截取一部分并转换为 6 位数字(Dynamic Truncation)
- 服务器端执行相同的计算,如果匹配则认证成功
主要认证应用的对比:
| 应用 | 云同步 | 导出方式 | 开源 |
|---|---|---|---|
| Google Authenticator | 有(Google 账户) | 二维码传输 | 否 |
| Microsoft Authenticator | 有(Microsoft 账户) | 云备份 | 否 |
| Authy | 有(加密) | 多设备同步 | 否 |
| Aegis (Android) | 无 | 加密备份 | 是 |
云同步在设备丢失时便于恢复,但如果同步目标账户被入侵,所有 TOTP 种子都会泄露。如果安全性是首要考虑,建议选择仅本地存储的应用,并另外保管加密备份。
安全密钥 - 基于 FIDO2/WebAuthn 的最强认证
安全密钥(如 YubiKey、Google Titan Key 等)是基于 FIDO2/WebAuthn 协议的硬件认证设备。它使用公钥加密技术,私钥被封存在设备内部,因此从原理上对钓鱼攻击和中间人攻击具有抵抗力。
WebAuthn 的认证流程如下:
- 注册时:安全密钥生成公钥和私钥对,将公钥发送给服务器。私钥保存在密钥内部,无法被提取
- 认证时:服务器发送一个随机挑战值(nonce)
- 安全密钥用私钥对挑战值进行签名,并将签名返回给服务器
- 服务器用公钥验证签名,匹配则认证成功
它能有效防御钓鱼攻击的原因在于,WebAuthn 将来源(域名)纳入了认证过程。如果伪造网站的域名与正规网站不同,安全密钥会拒绝签名。短信验证和 TOTP 没有这种机制,因此存在在钓鱼网站上输入验证码的风险。
通行密钥(Passkey)是 FIDO2 的进化形态,它允许使用智能手机的生物识别来替代安全密钥。Apple、Google、Microsoft 正在推进支持,预计将成为未来的主流方式。
主要服务的设置步骤
两步验证的设置方法因服务而异,但基本流程是相同的。建议与密码强化一起进行设置。
Google 账户
- 访问 myaccount.google.com 并选择"安全性"
- 点击"两步验证",注册手机号码(仅首次需要)
- 选择"身份验证器应用",用认证应用扫描二维码
- 如需添加安全密钥,从"添加安全密钥"注册 USB 密钥
Apple ID
- iPhone 的"设置"→ 点击你的名字 →"登录与安全性"→"双重认证"
- 注册受信任的电话号码(通过短信或语音通话接收验证码)
- iOS 16.3 及以上版本还支持注册安全密钥
Amazon
- "账户服务"→"登录和安全"→"两步验证设置"
- 扫描认证应用的二维码,输入显示的验证码进行确认
- 注册电话号码作为备用方式
无论哪个服务,设置时显示的恢复代码(备用代码)务必保存在安全的地方。如果设备丢失且没有恢复代码,将无法访问账户。
启用两步验证时需要注意的要点
两步验证是强大的防御手段,但在启用时存在一些陷阱。
- 恢复代码的保管:打印在纸上离线保管,或保存在密码管理器的加密存储中。仅靠手机截图在设备故障时无法恢复
- 确保备用方式:使用认证应用时,提前确认更换设备时迁移种子的步骤
- 从短信验证迁移:尽可能迁移到认证应用或安全密钥。即使保留短信验证,也不要将其作为主要认证方式
- 覆盖所有账户:为邮箱、云存储、社交媒体、金融服务等所有重要账户设置两步验证
在设置两步验证的同时,建议养成在查IP上检查浏览器指纹和连接来源信息的习惯,确认是否存在异常访问。
想要系统学习安全防护知识的读者,网络安全相关书籍也是很好的参考资料。