前言
随着越来越多的软件推广与强制双重因子验证2FA,我的手机也装上了Google Authenticator,但老实说,很长一段时间我只知道「打开 App → 输入六位数字」,对于这组数字为什么会一直变、服务器又是怎么验证的,其实没有真正了解过。直到最近在测试一些相关登录逻辑才回来补齐这块知识。
资安当中的验证因子
- 你知道的东西 What you know:密码、PIN code
- 你拥有的东西 What you have:手机、实体金钥、App 产生的验证码
- 你是谁 What you are:指纹、脸部、虹膜
双重因子验证(2FA)
相较于传统单一密码:
- 数据库被骇密码外泄
- 用户重复使用密码、弱密码、遗忘
- 重放攻击(Replay Attack)
- 社交工程或钓鱼网站
为了提高了安全性,双重因子验证要求两种以上不同验证因子,安全性通常来自于不同类型因子的组合,而不是同一类一直叠加,举例:
- 密码 + SMS 验证码
- 密码 + Google Authenticator 验证码
- 密码 + 指纹
一次性密码(OTP)
OTP 是一种只能使用一次、且通常具有时间或事件限制的密码。即使攻击者拦截了 OTP,也很难在有效期限内再次使用。OTP 并不是单一技术,而是一个概念,底下有多种实现方式有各自的优缺点:
| OTP 类型 | 说明 | 优点 | 缺点 | 常见使用场景 |
|---|---|---|---|---|
| 简讯 OTP (SMS OTP) | 服务器产生随机验证码,透过简讯传送到用户手机 | 实作简单、用户熟悉、不需额外 App | 易受 SIM Swap 攻击、可能被拦截或延遲、有发送成本 | 传统网站登录、银行低风险操作 |
| 电子邮件 OTP (Email OTP) | 将一次性验证码寄送至用户 Email | 成本低、实作容易、不依赖手机 | Email 本身可能已被入侵、即时性差 | 注册验证、忘记密码流程 |
| 硬体 (Token OTP) | 使用实体装置产生定期变化的 OTP | 不依赖网路、安全性高、难以远端攻击 | 成本高、遗失需补发、不方便携带 | 企业内部系统、金融机构 |
| 应用程式 OTP (TOTP) | 透过 App(如 Google Authenticator)根据时间产生 OTP | 不需网路、标准化、安全性高、成本低 | Secret 外泄即失效、可能遭即时钓鱼 | 主流 2FA、云端服务 |
| 事件型 OTP (HOTP) | 每次使用后递增计数器产生新 OTP | 不依赖时间、不受时钟误差影响 | 容易不同步、实作较复杂 | 特定硬体 Token |
从安全性与实务角度来看 TOTP,是目前安全性、成本与使用体验之间最平衡的 OTP 方案,也是现代 2FA 的主流选择,也是 Google Authenticator、Microsoft Authenticator、Authy 在做的事。