python一次性密码库

pyotp的Python项目详细描述


pyotp是一个用于生成和验证一次性密码的python库。它可以用来实现两个因素(2fa) 或者在web应用程序和其他需要用户登录的系统中使用多因素(mfa)身份验证方法。

开放的mfa标准在RFC 4226(hotp:基于hmac的一次 密码算法)和inRFC 6238(totp:基于时间的一次性密码 算法)。pyotp实现了对这两个标准的服务器端支持。客户端支持可以通过 通过短信或电子邮件(hotp)向用户发送身份验证码,或者,对于totp,通过指示用户使用Google AuthenticatorAuthy或其他 兼容的应用程序。用户可以通过手机摄像头扫描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 SheetNIST 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)扫描以下条形码:

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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java搜索文本中的字符串模式   SecurityManager引发异常的java Mockito模拟   java(仅限Netbeans)未找到适合jdbc的驱动程序:mysql://localhost   java计算给定字符串所有前缀的哈希值的子字符串的哈希值   java如何避免每次访问REST认证API以使用实际服务   用于HTML的java Jsoup选择器组合   可以复制或引用的java构造函数   Java中的HashMap。搞砸containsKey返回意外值   java数组平均值计算   java是检查字符串是否包含特定字符的最有效方法   java反序列化对象类已更改   java典型的EJB3/JPA/JSF中的事务范围是什么?   Install4j的java错误代码20   java:compileJava在本地项目()依赖项上的多模块项目上持续失败“错误:包x.y.z不存在”   java有一种生成Suppression的方法。现有代码库中checkstyle的xml文件?