How and Why Two Factor Authentication

为什么需要双重因子验证(2FA)?

前言

随着越来越多的软件推广与强制双重因子验证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🔗 在做的事。

延伸阅读