使用pyotp实现OTP一次性密码验证
OTP的基本原理
- 生成一个共享秘钥作为随机数的种子
- 服务端通过种子计算出当前的密码
- 客户端也通过相同的种子计算出当前的密码
- 验证客户端生成的密码和服务端生成的密码是否匹配
服务端和客户端计算的方式一样
共享密钥 + 时间因子 + 算法 => 密码结果
文档
- https://github.com/pyauth/pyotp
- https://github.com/tadeck/onetimepass/
- https://pyauth.github.io/pyotp/
安装
bash
pip install pyotp
基本使用示例
python
import pyotp
# 秘钥
secret_key = 'S5MPVVK6TYBAYJTKEWW5UGDSC2NX6OPS'
totp = pyotp.TOTP(secret_key)
# 生成一个随机密码
totp.now() # => '492039'
# 验证
totp.verify('198361') # 返回 True或False
秘钥有一定的规则,可以使用pyotp提供的方法生成一个随机秘钥
bash
secret_key = pyotp.random_base32() # S5MPVVK6TYBAYJTKEWW5UGDSC2NX6OPS
生成一个url,使用Google Authenticator扫描
python
# 生成一个url,使用Google Authenticator扫描
print(totp.provisioning_uri(name='alice@google.com', issuer_name='Secure App'))
# otpauth://totp/Secure%20App:alice%40google.com?secret=S5MPVVK6TYBAYJTKEWW5UGDSC2NX6OPS&issuer=Secure%20App
比如使用https://cli.im/text 生成二维码如下
参考