版权声明:本文可能为博主原创文章,若标明出处可随便转载。 https://blog.csdn.net/Jailman/article/details/77573792
#!/usr/bin/env python
# coding:utf8
"""
包含了一些在web中开发使用的TOTP双重因子验证等函数,可以结合谷歌的authenticator app使用
其中使用pyotp模块是最简单和方便的实现
"""
import hmac
import base64
import struct
import hashlib
import time
# from random import choice
# import string
import pyotp
import random
from qrcode import QRCode
def get_hotp_token(secret, intervals_no):
key = base64.b32decode(secret, True)
msg = struct.pack(">Q", intervals_no)
h = hmac.new(key, msg, hashlib.sha1).digest()
o = ord(h[19])& 15
h = (struct.unpack(">I", h[o:o+ 4])[0]& 0x7fffffff)% 1000000
return h
def get_totp_token(secret):
return get_hotp_token(secret, intervals_no=int(time.time())// 30)
# 随机密码生成器
# def GenPassword(length=10, chars=string.ascii_letters.lower()+string.digits):
# return ''.join([choice(chars) for i in range(length)])
# 生成二维码的函数
def get_qrcode(data, *args, **kwargs):
qr = QRCode(*args,**kwargs)
qr.add_data(data)
im = qr.make_image()
im.show()
# 生成随机google-authenticator密钥的函数
def random_base32(length=16,random=random.SystemRandom(),
chars=base64._b32alphabet.values()):
return ''.join(
random.choice(chars)
for i inxrange(length)
)
def main():
gtoken = pyotp.random_base32() # google token value
print gtoken
t = pyotp.TOTP(gtoken)
print t.now() # 使用pyotp更简单
print get_totp_token(gtoken)
email = "xyz@xyz.com"
get_qrcode(email)
print random_base32()
if __name__ =='__main__':
main()
# SN号必须为字母和数字的16位混合码