import time
import datetime
import math
import hmac
import base64
import qrcode
from PIL import Image
from pyzbar import pyzbar
from hashlib import sha1 '''
depend: qrcode,pillow,PIL,pyzbar ''' class GoogleAuthenticator(object): def __init__(self,secretKey=None,digits=6,interval=30):
self.secretKey = secretKey
self.digits = digits
self.interval = interval def __str_extend(self,old_str,length,extend_str):
new_strs = None
if len(old_str) < length:
clen = length - len(old_str)
s0 = ''.join([extend_str for i in range(clen)])
new_strs = s0 + old_str
elif len(old_str) == length:
new_strs = old_str
return new_strs def __str_split(self,old_str,split_len,prefix='',suffix=''):
array = []
str_len = len(old_str)
for i in range(0,str_len,4):
if i + 4 < str_len:
array.append(prefix+old_str[i:i+4]+suffix)
else:
array.append(prefix+old_str[i:str_len]+suffix)
return array def __base32tohex(self,base32str):
base32chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"
bits = ""
for i in range(len(base32str)):
char = str(base32str[i]).upper()
idx = int(base32chars.index(char))
bit = self.__str_extend(format(idx,'b'),5,'0')
if bit is None:
raise Exception('bit={},len={}'.format(bit,len(bit)))
bits += bit
bitArray = self.__str_split(bits,4,'0b')
hexstr = ''.join([format(int(i,2),'x') for i in bitArray])
return hexstr def __get_HexSecret(self):
hexstr = self.__base32tohex(self.secretKey)
return hexstr def __byte_secret(self):
missing_padding = len(self.secretKey) % 8
if missing_padding != 0:
self.secret += '=' * (8 - missing_padding)
return base64.b32decode(self.secretKey, casefold=True) def __int_to_bytestring(self,i, padding=8):
result = bytearray()
while i != 0:
result.append(i & 0xFF)
i >>= 8
return bytes(bytearray(reversed(result)).rjust(padding, b'\0')) def __timecode(self, for_time):
i = time.mktime(for_time.timetuple())
return int(i / self.interval) def get_QR_url(self):
base_url = "https://chart.googleapis.com/chart?chs=200x200&cht=qr&chl=200x200&chld=M|0&cht=qr&chl="
QR_url = base_url + "otpauth://totp/user@host.com\%3Fsecret%3D" + self.secretKey
return QR_url def get_QR_code(self):
qr = qrcode.QRCode(version=1,error_correction=qrcode.constants.ERROR_CORRECT_L,box_size=10,border=4)
data = self.get_QR_url()
qr.add_data(data=data)
qr.make(fit=True)
img = qr.make_image(fill_color="green", back_color="white")
img.show() def QR2url(self,QR_path):
base_url = 'https://chart.googleapis.com/chart?chs=200x200&cht=qr&chl=200x200&chld=M|0&cht=qr&chl='
ourl = pyzbar.decode(Image.open(QR_path), symbols=[pyzbar.ZBarSymbol.QRCODE])[0].data.decode("utf-8")
QR_url = base_url + ourl
return QR_url def QR2code(self,QR_path):
QR_url = pyzbar.decode(Image.open(QR_path), symbols=[pyzbar.ZBarSymbol.QRCODE])[0].data.decode("utf-8")
i = QR_url.find('\%3Fsecret%3D')
l = len('\%3Fsecret%3D')
if i == -1:
i = QR_url.find('?secret=')
l = len('?secret=')
if i == -1:
raise Exception('QR is error')
j = QR_url.find('?',i+1)
if j == -1:
j = QR_url.find('\%3F',i+1)
if j == -1:
sk = QR_url[i+l:]
else:
sk = QR_url[i+l:j]
self.secretKey = sk
timestamp = self.__timecode(datetime.datetime.now())
str_code = self.generate_otp(timestamp)
return str_code def generate_otp(self,timestamp):
key = self.secretKey
hasher = hmac.new(self.__byte_secret(), self.__int_to_bytestring(timestamp), sha1)
# print(hasher.hexdigest())
hmac_hash = bytearray(hasher.digest())
offset = hmac_hash[-1] & 0xf
code = ((hmac_hash[offset] & 0x7f) << 24 |
(hmac_hash[offset + 1] & 0xff) << 16 |
(hmac_hash[offset + 2] & 0xff) << 8 |
(hmac_hash[offset + 3] & 0xff))
str_code = str(code % 10 ** self.digits)
while len(str_code) < self.digits:
str_code = '0' + str_code
return str_code def getTotp(self):
timestamp = self.__timecode(datetime.datetime.now())
str_code = self.generate_otp(timestamp)
return str_code def at(self, for_time, counter_offset=0):
if not isinstance(for_time, datetime.datetime):
for_time = datetime.datetime.fromtimestamp(int(for_time))
return self.generate_otp(self.timecode(for_time) + counter_offset) def verifyTotp(self,str_code):
gTotp = self.getTotp()
if gTotp == str_code:
return True
else:
return False

  

python totp代码的更多相关文章

  1. Python一行代码

    1:Python一行代码画出爱心 print]+(y*-)**-(x**(y*<= ,)]),-,-)]) 2:终端路径切换到某文件夹下,键入: python -m SimpleHTTPServ ...

  2. python爬虫代码

    原创python爬虫代码 主要用到urllib2.BeautifulSoup模块 #encoding=utf-8 import re import requests import urllib2 im ...

  3. Python小代码_2_格式化输出

    Python小代码_2_格式化输出 name = input("name:") age = input("age:") job = input("jo ...

  4. Python小代码_1_九九乘法表

    Python小代码_1_九九乘法表 max_num = 9 row = 1 while row <= max_num: col = 1 while col <= row: print(st ...

  5. Python IDLE 代码高亮主题

    Python IDLE 代码高亮主题 使用方法: 打开C盘我的 C:\Documents and Settings\你的用户名.idlerc文件夹 里面会有一个 config-highlight.cf ...

  6. 代码块: 以冒号作为开始,用缩进来划分作用域,这个整体叫做代码块,python的代码块可以提升整体的整齐度,提高开发效率

    # ### 代码块: 以冒号作为开始,用缩进来划分作用域,这个整体叫做代码块 if 5 == 5: print(1) print(2) if True: print(3) print(4) if Fa ...

  7. uiautomatorviewer 优化定位符生成,支持生成Java,Python自动化代码

    项目介绍 二次开发 uiautomatorviewer 优化定位符生成,支持生成Java,Python自动化代码,修复自带工具画面有动态加载时截图失败问题,优化自带工具截图速度 ,实现类似录制脚本功能 ...

  8. Python实现代码统计工具——终极加速篇

    Python实现代码统计工具--终极加速篇 声明 本文对于先前系列文章中实现的C/Python代码统计工具(CPLineCounter),通过C扩展接口重写核心算法加以优化,并与网上常见的统计工具做对 ...

  9. Python静态代码检查工具Flake8

    简介 Flake8 是由Python官方发布的一款辅助检测Python代码是否规范的工具,相对于目前热度比较高的Pylint来说,Flake8检查规则灵活,支持集成额外插件,扩展性强.Flake8是对 ...

随机推荐

  1. 剑指offer 65. 不用加减乘除做加法(Leetcode 371. Sum of Two Integers)

    剑指offer 65. 不用加减乘除做加法(Leetcode 371. Sum of Two Integers) https://leetcode.com/problems/sum-of-two-in ...

  2. JAVA数据结构和算法 2-数组

    数组中使用的主要算法:插入.查找(线性查找-无序/二分查找-有序).删除 在JAVA中数组属于对象类型: 1.创建方法有3种: 或者 数组一旦创建,大小不可改变.数组大小可以通过length字段获得: ...

  3. 【转载】恢复误删文件--DOS命令应用实例(一)

    <电脑爱好者>报转载第一辑第二篇之恢复误删文件--DOS命令应用实例(一)                             恢复误删文件--DOS命令应用实例(一) 上期我们讲述了 ...

  4. 【VS开发】C/C++预编译命令

    C/C++中宏总结C程序的源代码中可包括各种编译指令,这些指令称为预处理命令或预处理器.虽然它们实际上不是C语言的一部分,但却扩展了C程 序设计的环境. 预处理指令的主要作用就是把通过预处理的内建功能 ...

  5. 最新 网龙网络java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.网龙网络等10家互联网公司的校招Offer,因为某些自身原因最终选择了网龙网络公司.6.7月主要是做系统复习.项目复盘.Le ...

  6. 39.创建多进程及进程通讯 -- Queue--Pipe--Event

    创建多进程 windows:进程.线程 linux:进程.线程(做了进程通信的多进程实现的线程) 进程之间内存彼此独立,不管是父子进程还是单个独立进程 multiprocessing:Process ...

  7. H3C 交换机配置ssh登陆

    1.开启ssh服务,创建密钥. <D05-S5048-02>system-view [D05-S5048-02]ssh server enable //开启ssh服务 [D05-S5048 ...

  8. Dijkstra算法——超~~详细!!

    Dijkstra算法_ ** 时隔多月,我又回来了!**_ 今天下午久违的又学了会儿算法,又重新学习了一遍Dijkstra,这是第三次重新学习Dijkstra(*以前学的都忘完了>_<*) ...

  9. Photon Server 实现注册与登录(二) --- 服务端代码整理

    一.有的代码前端和后端都会用到.比如一些请求的Code.使用需要新建项目存放公共代码. 新建项目Common存放公共代码: EventCode :存放服务端自动发送信息给客户端的code Operat ...

  10. PHP如何通过URL访问,获得新的URL 两种方法

    1.1 $url = 'http://passport.drcloud.cn/api/logon.asp?id=1&ru=http://203.158.158.122/store/thirdL ...