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

参考

相关推荐
2401_897190552 分钟前
PHP与Suno音乐生成AI集成开发音频应用【操作】
jvm·数据库·python
像一只黄油飞6 分钟前
第二章-04-数据类型
笔记·python·学习·零基础
两年半的个人练习生^_^7 分钟前
每日一学:设计模式之原型模式
java·开发语言·设计模式·原型模式
吕源林8 分钟前
mysql如何防止用户重命名数据库_限制ALTER与RENAME权限
jvm·数据库·python
elseif1238 分钟前
初学者必背【考点清单(大全)】【上篇】
开发语言·c++·笔记·学习·循环结构·分支结构·考纲
并不喜欢吃鱼9 分钟前
从零开始C++----二.(下篇)模版进阶与编译全过程的复习
开发语言·c++
2402_8548083711 分钟前
CSS代码复用性太低怎么办_通过BEM结构提升组件模块化
jvm·数据库·python
234710212711 分钟前
4.17 学习笔记
开发语言·软件测试·笔记·python·学习
m0_7489203612 分钟前
如何用 click 与 mousedown 区分鼠标点击与按下的触发顺序
jvm·数据库·python
m0_5150984214 分钟前
C#怎么使用并发集合 C#ConcurrentDictionary和ConcurrentQueue线程安全集合怎么用【进阶】
jvm·数据库·python