今天收到一封来自github的邮件,大致的意思是需要我在一个半月内完成2FA认证,否则后续将无法登录github。
2FA
2FA认证指的是双因子认证(Two Factor Authentication),这里的因子是身份认证因子,我们平常登录网站或者在app中设置的账户密码是属于秘密信息因子。除此之外还有物品因子(比如游戏行业的“将军令”,银行卡网银盾,验证码),生物特征因子(比如指纹,面部特征),位置因子(比如特定设备,特定位置,特定ip)等,有两个因子验证用户信息的都是2FA认证。
邮件中github给出了以下几种形式的2FA认证:
- Security key:硬件信息生成安全密钥,可以用usb移动硬盘、iPhone、iPad、Android设备(后三者要扫描QR码)
- GitHub Mobile:github的手机app
- Authenticator application (TOTP):验证器应用,使用的算法是一种基于时间的一次性密码算法(TOTP)
- Text messages (SMS):短信验证,国内的手机不可以
pyotp库
我第一次进行2FA认证的时候,官方2FA页面只提供了验证器应用的选项:
官方推荐的应用是1Password,Authy,Microsoft Authenticator。用过1Password的小伙伴应该知道,这个应用管理和生成各种网站密码确实好用,唯一的缺点是收费(学生可以申请6个月免费)。其他的应用不了解,类似的验证器应用还有个开源的Authenticator Pro,嗯…….不过这些用的2FA认证都是基于TOTP
算法,我们完全可以用python的pyotp
库实现一样的功能。
pyotp
库不是python自带的,需要在命令行终端安装:
1 | pip install pyotp |
我们可以直接扫码或者点击红框中的setup_key
获得github给我们创建的密钥(本地保存一份),然后运行以下python代码:
1 | import pyotp |
把输出的6个数字验证码输入框内:
第二步就会得到一个备用的恢复密钥,也下载到本地保存起来,以备不时之需。
接着点击下一步就完成了github的2FA验证,如果操作时间太长认证失败,就返回第一步重新来一遍。
我们用的TOTP算法是基于时间同步的,默认情况下验证码有效期只有30秒(默认一个步长的时间,如果没有时延窗口上一次生成的可能就会失效),客户端和服务端共享了一个初始的密钥(也就是第一步得到的setup_key),两边计算结果相同时才会认证成功。不知道以后github用到2FA认证会不会更新初始密钥,暂时保留着以防万一。