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

参考

相关推荐
wifi___30 分钟前
全局异常处理的原理
java·开发语言
平常心的技术小牛4 小时前
Qt-快速上手-QMenuBar
开发语言·qt
青 春 记 忆4 小时前
零基础入门Python11|Git实战:为任务管理器建立版本历史
开发语言·git·vscode·python·python3.11
Python私教4 小时前
多个项目怎么安全合并?先适配,再切换
后端·python·架构
陈皮波比茶6 小时前
Redis学习
数据库·redis·学习
余额瞒着我当琳6 小时前
C++--深拷贝三件套 + swap + 写时拷贝 + vector 扩容 + reserve
java·开发语言·c++
坐吃山猪6 小时前
WebClient内存配置解析
开发语言·springboot·webflux
北斗落凡尘7 小时前
LangGraph 入门实战(12)--使用MCP
后端·python·langchain
jdksjw7 小时前
同步与异步、阻塞与非阻塞、多线程、协程超详细讲解(Python并发编程从入门到精通)
开发语言·python
Zach_菠萝侠7 小时前
【DeepSeek Harness 研究】进化方向4:安全加固 思考、设计与实现
开发语言·安全·deepseek