Python一次性密码库
项目描述
PyOTP是一个用于生成和验证一次性密码的Python库。它可以用于在Web应用和其他需要用户登录的系统中实现双因素(2FA)或多因素(MFA)认证方法。
多因素认证(MFA)标准在RFC 4226(基于HMAC的一次性密码算法HOTP)和RFC 6238(基于时间的一次性密码算法TOTP)中定义。PyOTP实现了对这两个标准的服务器端支持。客户端支持可以通过通过短信或电子邮件(HOTP)发送认证代码来启用,对于TOTP,可以通过指导用户使用Google Authenticator、Authy或另一个兼容应用程序来实现。用户可以通过使用他们的手机摄像头扫描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)扫描以下条形码
现在运行以下命令并比较输出
import pyotp totp = pyotp.TOTP("JBSWY3DPEHPK3PXP") print("Current OTP:", totp.now())
第三方贡献
以下第三方贡献未由标准描述,非官方支持,仅供参考
pyotp.contrib.Steam():Steam TOTP的实现。与pyotp.TOTP()使用相同的API。
链接
ROTP - 由Mark Percival编写的原始Ruby OTP库
对于新应用程序
版本控制
本软件包遵循语义版本化2.0.0标准。为了控制更改,建议应用程序开发者锁定软件包版本,并使用pip-tools或类似工具进行管理。对于库开发者,建议锁定主要版本。
项目详情
下载文件
下载您平台的文件。如果您不确定选择哪个,请了解有关安装软件包的更多信息。
源分发
构建分发
pyotp-2.9.0.tar.gz的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 346b6642e0dbdde3b4ff5a930b664ca82abfa116356ed48cc42c7d6590d36f63 |
|
MD5 | 7b8838bc0553f4dd8ef6228c79f501de |
|
BLAKE2b-256 | f3b21d5994ba2acde054a443bd5e2d384175449c7d2b6d1a0614dbca3a63abfc |
pyotp-2.9.0-py3-none-any.whl的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 81c2e5865b8ac55e825b0358e496e1d9387c811e85bb40e71a3b29b288963612 |
|
MD5 | 037e4e5fbca83b4362db0f85076795ec |
|
BLAKE2b-256 | c3c0c33c8792c3e50193ef55adb95c1c3c2786fe281123291c2dbf0eaab95a6f |