google authenticator算法TOTP的python实现(函数与模块示例)

#!/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 = "[email protected]"
get_qrcode(email)

print random_base32()


if __name__ =='__main__':
main()


# SN号必须为字母和数字的16位混合码

你可能感兴趣的:(google authenticator算法TOTP的python实现(函数与模块示例))