文章目录
- 背景知识
- 什么是2FA
- 认证因子分类
- 知识因素
- 持有因素
- 解决方案
- 密码 + OTP
- 密码 + TOTP
- 方案对比
- 参考文档
- 后记
最近做海外项目,对合规方面的要求比较高,写一篇流水账来记录下
登录时的双因子认证
过程,于是开启了2FA(2 factor authentication)探索之旅~~
背景知识
什么是2FA
双重身份验证(2FA) 是一种身份验证方法,用户必须提供两个证据,如密码和一次性通行码,才能证明自己的身份并访问在线帐户或其他敏感资源。
认证因子分类
查阅资料,发现大家对于因子分类各有见解,此处就只列举最常规的几类:
- 知识因素:用户知道的内容,例如
密码、安全问题
等 - 持有因素:用户拥有的东西,例如
手机(验证码)、物理令牌、邮箱(接收一次性密码)
等 - 属性因素:用户个人具备的特征,例如
生物特征(指纹、人脸识别、虹膜)
等
在国外获取用户的生物特征信息等很困难,所以2FA的解决方案只有知识因素+持有因素了,下面着重对这两类认证因子进行介绍。
知识因素
最常见是密码,其他的还有个人识别码(PIN)和安全问题的答案等。
值得注意的是,需要密码和安全问题的常见做法并不是真正的 2FA,因为它使用了两个相同类型的因素,这里是两个知识因素。相反,这是一种两步验证过程。
持有因素
两种最常见的持有因素类型是软件令牌和硬件令牌。
令牌类型 | 方式 | 说明 |
---|---|---|
软件令牌 | OTP | 4-8位数字的一次性密码,通常基于短信、电子邮箱 |
– | TOTP | 基于时间的一次性密码,需要用户安装身份验证APP (Google Authenticator、Authy等) |
硬件令牌 | 密钥扣、身份证、加密狗等 |
解决方案
根据探索内容,针对2FA目前有两种简单的解决方案:
- 密码 + OTP
- 密码 + TOTP
密码 + OTP
交互流程:
- 用户在登录页,输入用户名+密码,点击登录
- 登录成功后,服务端生成OTP并存至redis(设置有效期30min)
- 服务端发送包含OTP的邮件到用户邮箱(注册时必填)
- web端接收到登录成功反馈后,跳转至输入认证码页面,等待用户输入
- 用户输入OTP,点击认证,服务端对比成功后进入系统
NOTE:大部分文章都建议使用短信发送OTP,因为SIM卡被劫持的风险比邮箱低,但是获取用户手机号难度大(一般不强制,毕竟隐私性强),还有发短信费用太高了。。。所以本文最后采用邮箱方式。
密码 + TOTP
流程如下:
- 密钥共享:服务端生成共享密钥,并通过安全渠道传输给客户端(通常是用户设备)。
- 生成一次性密码:客户端使用这个密钥和一个时间基数(例如每30秒更新一次),结合特定的Hash算法(如HMAC-SHA1),生成一个一次性密码。这个密码通常是6位数的数字,有时也会是更长。
- 一次性密码验证:用户在登录页面输入这个一次性密码,服务端同样用同样的方法计算出密码,并将它与服务端生成的密码比较。如果两者匹配,则认证成功。
方案对比
对比点 | 密码+OTP | 密码+TOTP |
---|---|---|
操作复杂度 | 低 | 高,用户需安装身份验证APP(国外用户都有?) |
安全性 | 低,邮箱被劫持风险很高 | 高 |
参考文档
多重要素验证
什么是双重身份验证?
多因子认证都有哪些认证方式?
Enabling Two-Factor Authentication For Your Web Application
2FA双因素认证 - TOTP详解
双因素认证(2FA, two-factor authentication)在国内似乎不流行?
后记
第一次接触国外web应用合规还蛮新奇的,翻阅资料后,才知道gitlab、邮箱等都有开启2FA认证的设置,只是之前没发现,本篇文章是记录探索过程的随笔,有错误的地方还望指正~~