#!/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位混合码