抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

今天收到一封来自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页面只提供了验证器应用的选项:

官方推荐的应用是1PasswordAuthyMicrosoft Authenticator。用过1Password的小伙伴应该知道,这个应用管理和生成各种网站密码确实好用,唯一的缺点是收费(学生可以申请6个月免费)。其他的应用不了解,类似的验证器应用还有个开源的Authenticator Pro,嗯…….不过这些用的2FA认证都是基于TOTP算法,我们完全可以用python的pyotp库实现一样的功能。

pyotp库不是python自带的,需要在命令行终端安装:

1
pip install pyotp

我们可以直接扫码或者点击红框中的setup_key获得github给我们创建的密钥(本地保存一份),然后运行以下python代码:

1
2
3
4
5
6
import pyotp

secret_key = "你的密钥字符串"
totp = pyotp.TOTP(secret_key)
val = totp.now()
print(val)

把输出的6个数字验证码输入框内:

第二步就会得到一个备用的恢复密钥,也下载到本地保存起来,以备不时之需。

接着点击下一步就完成了github的2FA验证,如果操作时间太长认证失败,就返回第一步重新来一遍。

我们用的TOTP算法是基于时间同步的,默认情况下验证码有效期只有30秒(默认一个步长的时间,如果没有时延窗口上一次生成的可能就会失效),客户端和服务端共享了一个初始的密钥(也就是第一步得到的setup_key),两边计算结果相同时才会认证成功。不知道以后github用到2FA认证会不会更新初始密钥,暂时保留着以防万一。

欢迎小伙伴们留言评论~