MFA
MFA必要性
- 为了提高安全性,提出了两步认证(
2-Step Verification
,又称多因素认证,Multi-Factor Authentication
)方式。 - 除了使用密码认证外,再增加一个认证因素,只有两步认证都通过,用户身份的认证过程才算完成。
- 第二种认证因素的形态和传输渠道与密码差异很大,如银行常见的有通过短信发送认证码,定时变化的数字
token
(Time-based One-Time Password
)等。 - 增加了一种认证因素,增加了攻击者的难度。
totp原理
多因素认证中,使用最方便的就是 TOTP
,服务器侧认证用户身份的工作过程和原理如下:
前提条件
- 服务器侧和用户的
TOTP
设备预先有个双方约定的同一个密钥K
(每个人的均不同)和一个算法 - 算法可以根据时间戳和密钥K计算出
6
位数字 (RFC6238 TOTP: Time-Based One-Time Password Algorithm
)
验证过程
TOTP
设备: 根据时间戳和密钥K计算出6
位数字,显示给用户。- 用户: 将这
6
位数字交给服务器。 - 服务器: 使用同样的算法计算出
6
位数字,如果与用户提交的相同,用户认证成功,否则认证失败。 - 考虑到双方时间可能有偏差,用户输入也需要时间,因此服务器在验证时往往会计算当前时刻前后几分钟的
6
位数字,只要有一个相同即认为认证成功。
totp 工程实践
开源的totp算法的实现可参考:https://github.com/pquerna/otp
生成key
1 |
|
- 生成的
key
信息格式类似:otpauth://totp/Example.com:bob@example.com?algorithm=SHA1&digits=6&issuer=Example.com&period=30&secret=JBSWY3DPEHPK3PXP
- 一般可将该
key
信息保存到一个二维码中,用于被Authenticator application
扫描,application
会将二维码中的信息进行存储,包括secret
和algorithm
,达到secret
和algorithm
共享的目的。
生成动态码
动态码一般情况下,由客户端生成
1 |
|
服务端验证
1 |
|
- 因为证明方和校验方都是基于时间来计算
OTP
,如果证明方在一个时间片段的最后时刻发送OTP
,在请求达到校验方时,已经进入下一个时间片段,如果校验方使用当前时间来计算OTP
,肯定会匹配失败,这样会导致一定的失败率,影响可用性。 - 校验方应该不仅仅以接收请求的时间,还应该用上一个时间片段来计算
TOTP
,增强容错性。不过,容错窗口越长,被攻击风险越高,“后向兼容”一般推荐不超过一个时间片段。 - 其中
opts.Skew
便是这个向后兼容性的设置,如果opts.Skew
被设置为1
,则有效的code
码包括当前code
码,前一个code
码以及下一个code
码。
参考
MFA
http://mybestcheng.site/2022/11/20/authenticate/mfa/