Python | 密码验证 | pyotp+qrcode实现MFA生成与验证(基于Python2.7.13)

# -*- coding:utf-8 -*-

import datetime
import pyotp
from qrcode import QRCode
from qrcode import constants

# 为了方便我用一个固定值测试
# secret_key = pyotp.random_base32()
secret_key = "IVMUUGHFE6XJ7YKX"


def generate_opt(username, issuer_name):
    """
    生成WFA认证二维码
    :param username: 用户名称
    :param issuer_name: 分发者名称
    :return: 生成二维码图片
    """
    totp = pyotp.TOTP(secret_key)
    provisioning_uri = totp.provisioning_uri(
        username,
        issuer_name=issuer_name,
    )
    qr = QRCode(version=1,
                error_correction=constants.ERROR_CORRECT_L,
                box_size=6,
                border=4, )
    qr.add_data(provisioning_uri)
    qr.make(fit=True)
    img = qr.make_image()
    img.save('./OPT_%s.png' % (secret_key))


def check(secret_key, confirmation_code):
    """
    通过 授权令牌 和 验证6位码,验证当前是否匹配
    :param secret_key: 授权令牌
    :param confirmation_code: 验证6位码
    :return: 认证情况
    """
    totp = pyotp.TOTP(secret_key)
    if totp.verify(confirmation_code):
        print('认证通过')
        return True
    else:
        print('认证失败')
        return False


def get_confirmation_code():
    """
    通过令牌直接获取并显示 验证6位码
    :return:
    """
    # 获取 secret_key 对应的一次性密码
    totp = pyotp.TOTP(secret_key)
    print(totp.now())
    return totp.now()
    # print(datetime.datetime.now())


# 注册
generate_opt('Ken', 'Thompson')

# 检验
check(secret_key, "123456")
new_confirmation_code = get_confirmation_code()
check(secret_key, new_confirmation_code)

# 你可以扫描生成的 OPT_XXX.png 图片查看实时 confirmation_code 值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

比特本特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值