Python实现TOTP动态验证码和二维码生成的示例代码
作者:林九生
在现代安全场景中,TOTP(基于时间的一次性密码)是一种广泛使用的双因素认证(2FA)机制,用于增强账户安全性。本文将介绍如何使用 Python 的 pyotp 和 qrcode 库来实现动态验证码的生成、验证以及二维码的创建。
环境准备
在开始之前,请确保已安装以下库:
- pyotp:用于生成和验证 TOTP。
- qrcode:用于生成二维码。
使用以下命令安装依赖:
pip install pyotp qrcode
实现步骤
1. 生成密钥并创建二维码
我们需要首先生成一个密钥,然后利用该密钥创建一个包含 TOTP URI 的二维码。以下是实现代码:
import pyotp # 导入 pyotp 库,用于生成和验证 TOTP
import qrcode # 导入 qrcode 库,用于生成二维码
# 步骤 1:生成一个密钥
totp = pyotp.TOTP(pyotp.random_base32()) # 随机生成一个 Base32 格式的密钥,并创建 TOTP 对象
print("密钥:", totp.secret) # 打印生成的密钥
# 步骤 2:生成二维码
# 根据密钥生成一个 TOTP URI,包含用户名和服务名称
uri = totp.provisioning_uri("example@domain.com", issuer_name="MyService")
print("URI:", uri) # 打印生成的 URI
# 使用 qrcode 库生成二维码并保存为图片
qr = qrcode.make(uri) # 将 URI 转换为二维码对象
qr.save("totp_qr.png") # 将二维码保存为图片文件
print("二维码已保存为 totp_qr.png") # 提示二维码已保存
二维码可以用谷歌身份验证器或类似工具扫描,来绑定账户。
2. 验证动态验证码
在绑定账户后,用户会定期生成一个 6 位动态验证码。以下代码展示如何通过密钥验证用户输入的验证码:
import pyotp # 导入 pyotp 库,用于生成和验证 TOTP
# 从生成密钥的脚本中获取密钥(假设你知道密钥)
secret = input("请输入密钥:") # 提示用户输入之前生成的密钥
totp = pyotp.TOTP(secret) # 使用用户提供的密钥创建 TOTP 对象
# 步骤 2:验证 TOTP 密码
user_input = input("请输入验证码:") # 提示用户输入当前显示的验证码
if totp.verify(user_input): # 验证用户输入的验证码是否有效
print("验证码正确!") # 如果验证码匹配当前时间窗口,打印提示
else:
print("验证码错误!") # 如果不匹配,打印错误提示
核心逻辑解析
密钥生成:pyotp.random_base32() 会生成一个符合 TOTP 标准的密钥。
TOTP URI:provisioning_uri 方法会生成一个标准的 URI,格式如下:
otpauth://totp/{服务名称}:{用户名}?secret={密钥}&issuer={服务名称}
二维码生成:使用 qrcode.make(uri) 将 URI 转换为二维码图像,可供用户扫描绑定。
动态验证码验证:调用 totp.verify(验证码) 方法验证用户输入是否匹配当前时间窗口的动态密码。
应用场景
双因素认证(2FA):通过密钥和动态验证码,提供一种额外的验证手段。
账户安全加固:即使密码泄露,攻击者也无法在没有 TOTP 验证的情况下访问账户。
二维码绑定:结合二维码,用户可以轻松通过扫描完成双因素认证的绑定。
注意事项
时间同步:由于 TOTP 基于时间窗口,确保服务器和客户端的时间保持同步非常重要。
密钥存储:请妥善保存密钥,避免泄露。
适配其他应用:本文生成的 URI 和二维码可以直接用于 Google Authenticator、Authy 等主流身份验证器。
总结
通过 pyotp 和 qrcode,我们能够快速实现 TOTP 动态验证码的生成、验证和二维码绑定功能。这种方案简单高效,适用于多种需要双因素认证的场景。
到此这篇关于Python实现TOTP动态验证码和二维码生成的示例代码的文章就介绍到这了,更多相关Python生成动态验证码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
