PyOTP

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 应用程序(例如谷歌身份验证器)扫描以下条形码:

https://chart.apis.google.com/chart?cht=qr&chs=250x250&chl=otpauth%3A%2F%2Ftotp%2Falice%40google.com%3Fsecret%3DJBSWY3DPEHPK3PXP

现在运行以下命令并比较输出:

import pyotp
totp = pyotp.TOTP("JBSWY3DPEHPK3PXP")
print("Current OTP:", totp.now())

链接

otpauth

otpauth 是一次性密码身份验证,通常称为两步验证。您可能已经从Google,Dropbox等处听说过。github

Installation

使用 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)