跳转到主要内容

Python一次性密码库

项目描述

PyOTP是一个用于生成和验证一次性密码的Python库。它可以用于在Web应用和其他需要用户登录的系统中实现双因素(2FA)或多因素(MFA)认证方法。

多因素认证(MFA)标准在RFC 4226(基于HMAC的一次性密码算法HOTP)和RFC 6238(基于时间的一次性密码算法TOTP)中定义。PyOTP实现了对这两个标准的服务器端支持。客户端支持可以通过通过短信或电子邮件(HOTP)发送认证代码来启用,对于TOTP,可以通过指导用户使用Google AuthenticatorAuthy或另一个兼容应用程序来实现。用户可以通过使用他们的手机摄像头扫描PyOTP提供的otpauth:// QR码来轻松地在他们的应用程序中设置认证令牌。

实现者应阅读并遵循相关RFC的HOTP安全要求TOTP安全考虑部分。至少,应用程序实现者应遵循以下清单

  • 使用HTTPS确保传输机密性

  • 通过在受控访问数据库中存储秘密确保HOTP/TOTP秘密机密性

  • 通过拒绝客户端已使用的单次密码来阻止重放攻击(这需要在您的数据库中存储最近认证的时间戳、OTP或OTP的哈希值,并在看到匹配时拒绝OTP)

  • 限制对您的应用程序登录功能的暴力破解攻击(参见RFC 4226,第7.3节)

  • 在实现“绿色”应用程序时,除了HOTP/TOTP之外,还应考虑支持FIDO U2F/WebAuthn。U2F使用非对称加密来避免使用共享密钥设计,这加强了您的MFA解决方案对服务器端攻击的防御。硬件U2F还将在专用单一用途设备中隔离客户端密钥,这加强了您的客户端对客户端攻击的防御。通过自动化凭据作用域到依赖方ID(应用程序起源/域名),U2F增加了对钓鱼攻击的保护。FIDO U2F/WebAuthn的一个实现是PyOTP的姐妹项目,PyWARP

我们还建议实现者阅读OWASP认证备忘单NIST SP 800-63-3:数字认证指南,以获得认证最佳实践的概述。

在您的手机上使用一次性密码的快速概述

  • OTP涉及存储在手机和服务器上的共享秘密

  • OTPs可以在没有互联网连接的手机上生成

  • OTP应始终用作认证的第二因素(如果您的手机丢失,您的帐户仍然通过密码受到保护)

  • Google Authenticator和其他OTP客户端应用程序允许您存储多个OTP秘密,并使用QR码提供这些秘密

安装

pip install pyotp

使用

基于时间的OTP

import pyotp
import time

totp = pyotp.TOTP('base32secret3232')
totp.now() # => '492039'

# OTP verified for current time
totp.verify('492039') # => True
time.sleep(30)
totp.verify('492039') # => False

基于计数器的OTP

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 Authenticator和其他OTP应用程序兼容

pyotp.random_base32()

某些应用程序希望将密钥格式化为十六进制编码的字符串

pyotp.random_hex()  # returns a 40-character hex-encoded secret

Google Authenticator兼容

PyOTP与Google Authenticator iPhone和Android应用程序以及Authy等其他OTP应用程序兼容。PyOTP包括为这些MFA客户端应用程序的QR码扫描器生成配置文件URI的能力

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应用程序(例如Google Authenticator)扫描以下条形码

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())

第三方贡献

以下第三方贡献未由标准描述,非官方支持,仅供参考

  • pyotp.contrib.Steam():Steam TOTP的实现。与pyotp.TOTP()使用相同的API。

版本控制

本软件包遵循语义版本化2.0.0标准。为了控制更改,建议应用程序开发者锁定软件包版本,并使用pip-tools或类似工具进行管理。对于库开发者,建议锁定主要版本。

https://github.com/pyauth/pyotp/workflows/Python%20package/badge.svg https://img.shields.io/codecov/c/github/pyauth/pyotp/master.svg https://img.shields.io/pypi/v/pyotp.svg https://img.shields.io/pypi/l/pyotp.svg https://readthedocs.org/projects/pyotp/badge/?version=latest

项目详情


下载文件

下载您平台的文件。如果您不确定选择哪个,请了解有关安装软件包的更多信息。

源分发

pyotp-2.9.0.tar.gz (17.8 KB 查看哈希

上传时间

构建分发

pyotp-2.9.0-py3-none-any.whl (13.4 KB 查看哈希

上传时间 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面