PyOTP 是一个用于生成和验证一次性密码的 Python 库。它可用于在 Web 应用程序和其他需要用户登录的系统中实现双因素 (2FA) 或多因素 (MFA) 身份验证方法。github
开放 MFA 标准在 RFC 4226(HOTP:基于 HMAC 的一次性密码算法)和 RFC 6238(TOTP:基于时间的一次性密码算法)中定义。PyOTP 实现了对这两种标准的服务器端支持。可以通过通过短信或电子邮件 (HOTP) 向用户发送身份验证代码来启用客户端支持,或者对于 TOTP,可以通过指示用户使用 Google 身份验证器、Authy 或其他兼容的应用程序来启用客户端支持。 用户可以通过使用手机摄像头扫描 PyOTP 提供的 otpauth:// 二维码,轻松地在其应用程序中设置身份验证令牌。
实施者应阅读并遵循相关 RFC 的 HOTP 安全要求和 TOTP 安全注意事项部分。应用程序实现者至少应遵循以下清单:
我们还建议实施者阅读 OWASP 身份验证备忘单和 NIST SP 800-63-3:数字身份验证指南,以获得身份验证最佳实践的高级概述。
pip install pyotp
import pyotp
import time
totp = pyotp.TOTP('base32secret3232') # 接受的是base32编码过的secret
totp.now() # => '492039'
# OTP verified for current time
totp.verify('492039') # => True
time.sleep(30)
totp.verify('492039') # => False
import pyotp
hotp = pyotp.HOTP('base32secret3232')
hotp.at(0) # => '260182'
hotp.at(1) # => '055283'
hotp.at(1401) # => '316439'
# OTP verified with a counter
hotp.verify('316439', 1401) # => True
hotp.verify('316439', 1402) # => False
提供了一个帮助程序函数来生成一个 32 个字符的 base32 密钥,与 Google 身份验证器和其他 OTP 应用程序兼容:
pyotp.random_base32()
某些应用程序希望将密钥格式化为十六进制编码的字符串:pyotp >= 2.4.0
pyotp.random_hex() # returns a 40-character hex-encoded secret
PyOTP可与Google Authenticator iPhone和Android应用程序以及Authy等其他OTP应用程序配合使用。PyOTP 包括生成预配 URI 的功能,以便与这些 MFA 客户端应用程序中内置的 QR 码扫描程序一起使用:
pyotp.totp.TOTP('JBSWY3DPEHPK3PXP').provisioning_uri(name='alice@google.com', issuer_name='Secure App')
>>> 'otpauth://totp/Secure%20App:alice%40google.com?secret=JBSWY3DPEHPK3PXP&issuer=Secure%20App'
pyotp.hotp.HOTP('JBSWY3DPEHPK3PXP').provisioning_uri(name="alice@google.com", issuer_name="Secure App", initial_count=0)
>>> 'otpauth://hotp/Secure%20App:alice%40google.com?secret=JBSWY3DPEHPK3PXP&issuer=Secure%20App&counter=0'
然后,可以将此 URL 呈现为 QR 码(例如,使用 https://github.com/soldair/node-qrcode),然后可以对其进行扫描并将其添加到 OTP 凭据的用户列表中。
还支持解析这些 URL:
pyotp.parse_uri('otpauth://totp/Secure%20App:alice%40google.com?secret=JBSWY3DPEHPK3PXP&issuer=Secure%20App')
>>> <pyotp.totp.TOTP object at 0xFFFFFFFF>
pyotp.parse_uri('otpauth://hotp/Secure%20App:alice%40google.com?secret=JBSWY3DPEHPK3PXP&issuer=Secure%20App&counter=0'
>>> <pyotp.totp.HOTP object at 0xFFFFFFFF>
使用手机的 OTP 应用程序(例如谷歌身份验证器)扫描以下条形码:
现在运行以下命令并比较输出:
import pyotp
totp = pyotp.TOTP("JBSWY3DPEHPK3PXP")
print("Current OTP:", totp.now())
otpauth 是一次性密码身份验证,通常称为两步验证。您可能已经从Google,Dropbox等处听说过。github
使用 pip 安装 otpauth 很简单:
$ pip install otpauth
或者,使用easy_install:
$ easy_install otpauth
生成和验证 otp 代码非常简单:
>>> from otpauth import OtpAuth
>>> auth = OtpAuth('secret') # a secret string # 接受的是未经base32编码过的string
>>> auth.hotp() # generate a count based code, default count is 4
330810
>>> auth.valid_hotp(330810)
4
>>> auth.hotp(2) # generate a count based code, count is 2
720111
>>> auth.valid_hotp(720111)
2
>>> auth.totp() # generate a time based code
828657
>>> auth.valid_totp(828657)
True
您可以为谷歌身份验证器创建一个二维码进行扫描:
>>> from otpauth import OtpAuth
>>> auth = OtpAuth('secret') # a secret string
>>> s = auth.to_uri('totp', 'Example:foo@bar.baz', 'Foo')
>>> import qrcode
>>> img = qrcode.make(s)