一、环境依赖
python环境、pyotp 以及 qrcode 两个 python库。
pip install pyotp
pip install qrcode
二、密钥文件生成
# KeyGenerate.py
import pyotp
sec = pyotp.random_base32()
# 文件名
filename = 'secret_base.txt'
# 将安全令牌基础写入文件
with open(filename, 'w') as file:
file.write(sec)
print(f"安全令牌基础已保存到文件 {filename}")
三、生成Qrcode
# QrcodeGenerate.py
import qrcode
import pyotp
# 文件名
filename = 'secret_base.txt'
# 从文件中读取内容
with open(filename, 'r') as file:
stored_sec = file.read()
topt = pyotp.TOTP(stored_sec)
# 获取二维码 URI
qr_uri = topt.provisioning_uri('test')
# 生成二维码
img = qrcode.make(qr_uri)
# 保存或显示QR码图像
img.save("otp_qr.png")
#img.get_image().show() # 显示二维码
四、验证Qrcode
# VertyQrcode.py
import pyotp
import sys
# 文件名
filename = 'secret_base.txt'
# 从文件中读取内容
with open(filename, 'r') as file:
stored_sec = file.read()
# 假设这是您从文件中读取的密钥
totp = pyotp.TOTP(stored_sec)
# 获取当前时间戳下的OTP
current_otp = totp.now()
if len(sys.argv) > 1:
scanned_otp = sys.argv[1]
# 验证扫描得到的OTP
if scanned_otp == current_otp:
print("验证成功!")
else:
print("验证失败,请重试。")
五、生成带信息内容的二维码(例外)
# InfoGenerate.py
import qrcode
# 设备基础信息
device_info = {
"name": "ZYH_NAS_Z4PRO",
"serial_number": "SN42108991",
"location": "重庆市南岸区十一中",
"status": "离线"
}
# 将设备信息转换为JSON字符串
device_info_str = str(device_info)
# 创建二维码对象
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
# 添加数据到二维码
qr.add_data(device_info_str)
qr.make(fit=True)
# 创建二维码图片
img = qr.make_image(fill='black', back_color='white')
# 保存二维码图片
img.save("device_qr_code.png")