今早收到邮件,GitHub要求用户强制开启两步验证:
打开GitHub的设置,却发现推荐的两步验证方法要求下载1Password/Authy/Microsoft Authenticator等APP。
可是1password是个收费软件,而且还不便宜。
第二个通过手机短信验证码的方式,还不支持中国大陆的手机号:Countries where SMS authentication is supported - GitHub Docs
怎么办呢?
自己动手,丰衣足食!
首先看看这种验证机制的原理。
基于时间的一次性密码(Time-based One-Time Password,TOTP)是一种双因素身份验证(2FA)方法,它根据共享的密钥和当前时间生成唯一的临时密码。TOTP通常用作在线账户的额外安全层,帮助防止未经授权的访问。TOTP是一种在RFC 6238下标准化的算法。
以下是TOTP工作原理的简要概述:密钥生成:在为帐户设置TOTP时,将生成一个唯一的密钥。该密钥在用户设备(通常是智能手机)和认证服务器之间共享。密钥通常表示为二维码,以便轻松设置。时间同步:用户设备和认证服务器需要同步到相同的时间源。TOTP算法依赖于当前时间来生成一次性密码。OTP生成:TOTP算法将密钥和当前时间结合起来,应用加密哈希函数(例如SHA-1、SHA-256或SHA-512)生成一次性密码。此密码通常包含6-8位数字,并具有有限的有效期,例如30或60秒。OTP验证:当用户尝试登录时,他们输入常规密码以及由TOTP应用程序或设备生成的一次性密码。然后,认证服务器根据共享密钥和当前时间独立生成预期的OTP。如果用户输入的OTP与服务器生成的OTP匹配,则授权访问。
由于一次性密码经常更改(每30或60秒),即使攻击者设法截获有效的OTP,他们也只有非常有限的时间窗口来使用它。这为认证过程增加了额外的安全层,使未经授权的用户更难以访问帐户。
简单来说,TOTP就是在用户和系统之间共享密钥,并同步时间,然后计算一个基于时间的函数,验证双方得到的结果是否一致。
otpauth://totp/Twilio:krobinson@twilio.com?secret=JBSWY3DPEHPK3PXP&issuer=Twilio&algorithm=SHA1&digits=6&period=30 (二维码自动识别)
要使用 Python 计算 TOTP,可以使用 库。首先使用 pip 安装库:pip install pyotp
安装库后,可以使用以下示例生成和验证 TOTP 代码:
此示例生成一个随机密钥,创建一个 TOTP 对象,生成当前的 OTP 并验证它。验证分两次进行:一次是立即进行,一次是在时间间隔过后进行,以演示 OTP 的有效性窗口。
请注意,在现实世界的情况下,在设置过程中,密钥将在用户设备和认证服务器之间共享,服务器将独立生成 OTP 以进行验证。所以,如果你想自己从密钥生成TOTP,只需要:
有关更多信息和高级用法,请参阅 文档:https://github.com/pyauth/pyotp
如果你不想用Python来自己计算,也可以使用一些第三方的插件。在这里我推荐一个叫做Authenticator的插件,它不会联网,不上传用户的数据,只是静静地为你计算TOTP验证码。
传送地址:https://chrome.google.com/webstore/detail/authenticator/bhghoamapcdpbohphigoooaddinpkbai/
使用方式很简单,只需要在安装好了之后点击扫描二维码,然后用鼠标选取二维码区域,就可以啦。
“使用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?
请把第一个回答翻译成中文。请将第二份回答翻译成中文,代码应该保持英文,但是要为每一行代码加上中文注释。