Python: 使用pyotp实现OTP一次性密码验证

使用pyotp实现OTP一次性密码验证

OTP的基本原理

  1. 生成一个共享秘钥作为随机数的种子
  2. 服务端通过种子计算出当前的密码
  3. 客户端也通过相同的种子计算出当前的密码
  4. 验证客户端生成的密码和服务端生成的密码是否匹配

服务端和客户端计算的方式一样

复制代码
共享密钥 + 时间因子 + 算法 => 密码结果

文档

安装

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 生成二维码如下

参考

相关推荐
数据开发 Yang 同学8 分钟前
【Python 并发编程】线程、进程、协程、同步/异步一次说清
python
JavaEdge.9 分钟前
scoped 样式与 data-v-* 属性选择器(写给 Javaer)
开发语言·vue
坐吃山猪11 分钟前
JDK 8 到 JDK 21 新特性知识要点
java·开发语言·windows
坐吃山猪13 分钟前
【多线程】FutureTask多线程底层实现
java·开发语言·数据库
程序员杰哥14 分钟前
如何做接口测试?
自动化测试·python·测试工具·职场和发展·测试用例·接口测试·postman
XR12345678817 分钟前
办公组网像“看病“:先问诊,再选型
开发语言·php
weixin1997010801617 分钟前
[特殊字符]《从0到1:闲鱼开放平台授权登录 + AccessToken 刷新 + 聚石塔部署完整链路》(附Python源码)
java·数据库·python
布莱克60519 分钟前
strcpy 函数详解:作用、用法与安全缺陷
c语言·开发语言·c++·安全
软件黑马王子28 分钟前
3.单例模式问题1:构造函数
开发语言·单例模式·c#
Freak嵌入式35 分钟前
RP2040 PIO 编程模型与状态机原理:从硬件架构到工作逻辑全解析
java·大数据·开发语言·单片机·嵌入式硬件·硬件架构