python一次性密码库
pyotp的Python项目详细描述
pyotp是一个用于生成和验证一次性密码的python库。它可以用来实现两个因素(2fa) 或者在web应用程序和其他需要用户登录的系统中使用多因素(mfa)身份验证方法。
开放的mfa标准在RFC 4226(hotp:基于hmac的一次 密码算法)和inRFC 6238(totp:基于时间的一次性密码 算法)。pyotp实现了对这两个标准的服务器端支持。客户端支持可以通过 通过短信或电子邮件(hotp)向用户发送身份验证码,或者,对于totp,通过指示用户使用Google Authenticator、Authy或其他 兼容的应用程序。用户可以通过手机摄像头扫描pyotp提供的otpauth://二维码,在应用程序中轻松设置身份验证令牌。
实现者应该阅读并遵循HOTP security requirements 以及相关RFC的TOTP security considerations部分。在 至少,应用程序实现者应该遵循以下清单:
- 使用https确保传输机密性
- 通过将机密存储在受控访问数据库中,确保hotp/totp机密的机密性
- 通过拒绝客户端使用的一次性密码来拒绝重播攻击(这需要存储 最近通过身份验证的时间戳、otp或数据库中otp的哈希,并在看到匹配时拒绝otp)
- 限制对应用程序登录功能的暴力攻击
- 在实现“greenfield”应用程序时,请考虑支持 FIDO U2F/WebAuthn英寸 添加到hotp/totp。U2F使用非对称加密来避免使用共享的机密设计,这增强了 针对服务器端攻击的mfa解决方案。硬件u2f还将客户机机密存储在一个专用的单一用途中 设备,它可以增强客户机抵御客户端攻击。通过自动确定 依赖方ID(应用程序源/域名),U2F增加了对网络钓鱼攻击的保护。一次实施 fido u2f/webauthn是pyotp的姊妹项目PyWARP。
我们还建议实现者阅读 OWASP Authentication Cheat Sheet和 NIST SP 800-63-3: Digital Authentication Guideline用于高级概述 认证最佳实践。
在手机上使用一次性密码的快速概述
- otp包含一个共享的秘密,存储在电话和服务器上
- OTP可以在没有互联网连接的手机上生成
- OTP应始终用作第二个身份验证因素(如果您的手机丢失,则您的帐户仍有密码保护)
- google authenticator和其他otp客户端应用程序允许您存储多个otp机密,并使用二维码提供这些机密
安装
pip install pyotp
用法
基于时间的otp
totp = pyotp.TOTP('base32secret3232') totp.now() # => '492039' # OTP verified for current time totp.verify('492039') # => True time.sleep(30) totp.verify('492039') # => False
基于计数器的otp
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
生成base32密钥
pyotp.random_base32() # returns a 16 character base32 secret. Compatible with Google Authenticator and other OTP apps
谷歌认证器兼容
pyotp与google authenticator iphone和android应用程序以及authy等其他otp应用程序协同工作。Pyotp包括 能够生成配置uri,以便与内置在这些mfa客户端应用程序中的二维码扫描仪一起使用:
pyotp.totp.TOTP('JBSWY3DPEHPK3PXP').provisioning_uri("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("alice@google.com", initial_count=0, issuer_name="Secure App") >>> 'otpauth://hotp/Secure%20App:alice%40google.com?secret=JBSWY3DPEHPK3PXP&issuer=Secure%20App&counter=0'
然后可以将此url呈现为二维码(例如,使用https://github.com/neocotic/qrious),然后可以对其进行扫描 并添加到otp凭据的用户列表中。
工作示例
使用您手机的OTP应用程序(如Google Authenticator)扫描以下条形码:
现在运行以下命令并比较输出:
import pyotp totp = pyotp.TOTP("JBSWY3DPEHPK3PXP") print("Current OTP:", totp.now())
链接
- Project home page (GitHub)
- Documentation (Read the Docs)
- Package distribution (PyPI)
- Change log
- RFC 4226: HOTP: An HMAC-Based One-Time Password
- RFC 6238: TOTP: Time-Based One-Time Password Algorithm
- ROTP-原始ruby otp库由Mark Percival
- OTPHP-rotp的php端口由Le Lag
- OWASP Authentication Cheat Sheet
- NIST SP 800-63-3: Digital Authentication Guideline
对于新应用程序: