GitHub强制要求开启两步验证了,但是1password要收费,怎么办?

知乎 · · 1084 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

今早收到邮件,GitHub要求用户强制开启两步验证:

打开GitHub的设置,却发现推荐的两步验证方法要求下载1Password/Authy/Microsoft Authenticator等APP。

可是1password是个收费软件,而且还不便宜。

第二个通过手机短信验证码的方式,还不支持中国大陆的手机号:Countries where SMS authentication is supported - GitHub Docs

怎么办呢?

自己动手,丰衣足食!

首先看看这种验证机制的原理。

基于时间的一次性密码(time-based one-time password, TOTP)的原理

基于时间的一次性密码(Time-based One-Time Password,TOTP)是一种双因素身份验证(2FA)方法,它根据共享的密钥和当前时间生成唯一的临时密码。TOTP通常用作在线账户的额外安全层,帮助防止未经授权的访问。TOTP是一种在RFC 6238下标准化的算法。

以下是TOTP工作原理的简要概述:

  1. 密钥生成:在为帐户设置TOTP时,将生成一个唯一的密钥。该密钥在用户设备(通常是智能手机)和认证服务器之间共享。密钥通常表示为二维码,以便轻松设置。
  2. 时间同步:用户设备和认证服务器需要同步到相同的时间源。TOTP算法依赖于当前时间来生成一次性密码。
  3. OTP生成:TOTP算法将密钥和当前时间结合起来,应用加密哈希函数(例如SHA-1、SHA-256或SHA-512)生成一次性密码。此密码通常包含6-8位数字,并具有有限的有效期,例如30或60秒。
  4. OTP验证:当用户尝试登录时,他们输入常规密码以及由TOTP应用程序或设备生成的一次性密码。然后,认证服务器根据共享密钥和当前时间独立生成预期的OTP。如果用户输入的OTP与服务器生成的OTP匹配,则授权访问。

由于一次性密码经常更改(每30或60秒),即使攻击者设法截获有效的OTP,他们也只有非常有限的时间窗口来使用它。这为认证过程增加了额外的安全层,使未经授权的用户更难以访问帐户。

简单来说,TOTP就是在用户和系统之间共享密钥,并同步时间,然后计算一个基于时间的函数,验证双方得到的结果是否一致。

使用Python代码来实现自己的TOTP计算器

要使用 Python 计算 TOTP,可以使用 pyotp 库。首先使用 pip 安装库:pip install pyotp

安装库后,可以使用以下示例生成和验证 TOTP 代码:

import pyotp
import time

# 生成一个密钥(base32 编码)
secret_key = pyotp.random_base32()

# 使用密钥和时间间隔(默认为 30 秒)创建一个 TOTP 对象
totp = pyotp.TOTP(secret_key)

# 生成当前的 OTP
current_otp = totp.now()
print(f"当前 OTP: {current_otp}")

# 验证 OTP(为演示目的,我们使用刚生成的 OTP)
is_valid = totp.verify(current_otp)
print(f"OTP 是否有效? {is_valid}")

# 为了演示 OTP 有效性窗口,等待下一个时间间隔
time.sleep(31)

# 再次尝试验证 OTP(由于时间窗口已过,应该无效)
is_valid = totp.verify(current_otp)
print(f"OTP 仍然有效吗? {is_valid}")

此示例生成一个随机密钥,创建一个 TOTP 对象,生成当前的 OTP 并验证它。验证分两次进行:一次是立即进行,一次是在时间间隔过后进行,以演示 OTP 的有效性窗口。

请注意,在现实世界的情况下,在设置过程中,密钥将在用户设备和认证服务器之间共享,服务器将独立生成 OTP 以进行验证。所以,如果你想自己从密钥生成TOTP,只需要:

import pyotp
secret_key = 'whatever_your_key_is'
print(pyotp.TOTP(secret_key).now())

有关更多信息和高级用法,请参阅 pyotp 文档:github.com/pyauth/pyotp

Chrome插件

如果你不想用Python来自己计算,也可以使用一些第三方的插件。在这里我推荐一个叫做Authenticator的插件,它不会联网,不上传用户的数据,只是静静地为你计算TOTP验证码。

传送地址:chrome.google.com/webst

使用方式很简单,只需要在安装好了之后点击扫描二维码,然后用鼠标选取二维码区域,就可以啦。

GPT-4使用声明

“使用Python代码来实现自己的TOTP计算器”的部分由GPT-4完成,提问过程见下图。

这个过程中,我提了四个问题:

Can you tell me what is "time-based one-time password (TOTP)" and how it works?
How to calculate TOTP using python?

请把第一个回答翻译成中文。
请将第二份回答翻译成中文,代码应该保持英文,但是要为每一行代码加上中文注释。

1084 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传