一、环境依赖

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")