每日一模块-双因子认证实现

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:SunXiuWen
# datetime:2022/7/8 0008
"""Two-factor authentication,简称 2FA,也就是双因素验证

最常见的就是用户名密码,再加一个动态码。动态码通常由随身携带的移动设备上生成,比如 U 盾、手机。

动态码最常见的实现算法就是 One-Time Password(OTP),是基于时间的一次性密码,它是公认的可靠解决方案,
已经写入国际标准 RFC6238。比如我们最常用的 Google Authenticator,就是 OTP。

pip install pyotp

"""
import pyotp
import qrcode

# 基于时间戳的双因子认证,默认验证码30秒

# 1.服务端生成密钥
secret = pyotp.random_base32()  # 文本32位
print(pyotp.random_hex(), len(pyotp.random_hex()))  # 40位

# 2.服务端生成基于时间戳的方式用于第三方OTP软件可识别的url,用户绑定服务器与当前用户的唯一凭证,如Google Authenticator【该软件帮我们记录用户与服务器的关系,及生成当需要访问服务器时的时间戳】
otp_uri = pyotp.TOTP(secret).provisioning_uri(name="xiuwensun@163.com",  # 用户账户
                                              issuer_name="BeiJinCompany")  # 公司名

print(otp_uri)

# 3.服务端将密钥uri转化为二维码,用户绑定到相应的app
secret_img = qrcode.make(otp_uri)
secret_img.save("one_user_secret.png")

# 4.服务端收到用户在客户端输入的数字,进行验证
code = input("请输入当前验证码:")
s_totp = pyotp.TOTP(secret)  # 获取用户当时注册时分配的密钥
flag = s_totp.verify(code)
print(flag)


posted @ 2022-07-19 17:19  Alive_2020  阅读(306)  评论(0编辑  收藏  举报