web应用合规(一)双因子认证2FA解决方案

1 篇文章 0 订阅
1 篇文章 0 订阅


     最近做海外项目,对合规方面的要求比较高,写一篇流水账来记录下 登录时的双因子认证过程,于是开启了2FA(2 factor authentication)探索之旅~~

背景知识

什么是2FA

双重身份验证(2FA) 是一种身份验证方法,用户必须提供两个证据,如密码和一次性通行码,才能证明自己的身份并访问在线帐户或其他敏感资源。

认证因子分类


查阅资料,发现大家对于因子分类各有见解,此处就只列举最常规的几类:
  • 知识因素:用户知道的内容,例如密码、安全问题
  • 持有因素:用户拥有的东西,例如手机(验证码)、物理令牌、邮箱(接收一次性密码)
  • 属性因素:用户个人具备的特征,例如生物特征(指纹、人脸识别、虹膜)

在国外获取用户的生物特征信息等很困难,所以2FA的解决方案只有知识因素+持有因素了,下面着重对这两类认证因子进行介绍。

知识因素

最常见是密码,其他的还有个人识别码(PIN)和安全问题的答案等。

值得注意的是,需要密码和安全问题的常见做法并不是真正的 2FA,因为它使用了两个相同类型的因素,这里是两个知识因素。相反,这是一种两步验证过程。

持有因素

两种最常见的持有因素类型是软件令牌和硬件令牌。

令牌类型方式说明
软件令牌电子邮件验证链接形如https://your-app.com/verify?token=<TOKEN>链接有过期时间
其中token是生成的安全令牌(唯一且安全)
电子邮箱验证码OTP,生成一个4-8位随机数,30min后过期
TOTP基于时间的一次性密码,需要用户安装身份验证APP(Google Authenticator、Authy等)
短信验证码OTP,具有时效性
服务商提供的身份验证二维码例如微信扫码认证
硬件令牌密钥扣、身份证、加密狗等

解决方案

根据探索内容,针对2FA目前有两种简单的解决方案:

  • 密码 + OTP
  • 密码 + TOTP

密码 + OTP

交互流程:

  1. 用户在登录页,输入用户名+密码,点击登录
  2. 登录成功后,服务端生成OTP并存至redis(设置有效期30min)
  3. 服务端发送包含OTP的邮件到用户邮箱(注册时必填)
  4. web端接收到登录成功反馈后,跳转至输入认证码页面,等待用户输入
  5. 用户输入OTP,点击认证,服务端对比成功后进入系统

NOTE:大部分文章都建议使用短信发送OTP,因为SIM卡被劫持的风险比邮箱低,但是获取用户手机号难度大(一般不强制,毕竟隐私性强),还有发短信费用太高了。。。所以本文最后采用邮箱方式。

密码 + TOTP

流程如下:

  1. 密钥共享:服务端生成共享密钥,并通过安全渠道传输给客户端(通常是用户设备)。
  2. 生成一次性密码:客户端使用这个密钥和一个时间基数(例如每30秒更新一次),结合特定的Hash算法(如HMAC-SHA1),生成一个一次性密码。这个密码通常是6位数的数字,有时也会是更长。
  3. 一次性密码验证:用户在登录页面输入这个一次性密码,服务端同样用同样的方法计算出密码,并将它与服务端生成的密码比较。如果两者匹配,则认证成功。

TOTP流程图

方案对比

对比点密码+OTP密码+TOTP
操作复杂度高,用户需安装身份验证APP(国外用户都有?)
安全性低,邮箱被劫持风险很高

参考文档

多重要素验证
什么是双重身份验证?
多因子认证都有哪些认证方式?
Enabling Two-Factor Authentication For Your Web Application
2FA双因素认证 - TOTP详解
双因素认证(2FA, two-factor authentication)在国内似乎不流行?

后记

第一次接触国外web应用合规还蛮新奇的,翻阅资料后,才知道gitlab、邮箱等都有开启2FA认证的设置,只是之前没发现,本篇文章是记录探索过程的随笔,有错误的地方还望指正~~

gitlab的2FA开启配置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值