自定义TOTP方法,实现google的TOTP令牌token
参考链接: https://blog.csdn.net/jailman/article/details/77573792
同时,做了:
1. 位数的修改
2. 补充了注释说明
3. 优化了Python2版本代码升级到Python3版本。
'''
@Author: Mikeliu@2020
@Date: 2020-03-30 14:28:34
@LastEditTime: 2020-03-30 18:23:18
@LastEditors: Mikeliu@2020
@Description:
'''
#!/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 QRCodedigtlength = 8 # 自定义算法生产 token 的长度def get_hotp_token(secret, intervals_no):key = base64.b32decode(secret, True) # 传入的 密码参数 使用base64加密# print(type(intervals_no),intervals_no)msg = struct.pack(">Q", intervals_no) # 整形数值打包成 bytes# print(type(msg),msg)h = hmac.new(key, msg, hashlib.sha1).digest() # 采用 HMAC加密算法o = ord(h.decode('utf-8','replace')[-1])& 15h = (struct.unpack(">I", h[o:o+ 4])[0]& 0x7fffffff)% (10**digtlength) # SHA-1 加密,同时解包成整形h = str(h)while len(h) < digtlength: # 不足位数,改成字符形式,高位补 ‘0’h = '0' + hreturn hdef get_totp_token(secret):return get_hotp_token(secret, intervals_no=int(time.time())// 30) # 获取当前时间,30s 为单位,总计多少个单位# 随机密码生成器
def GenPassword(length=16, chars=string.ascii_letters.upper()+string.digits): # 随机获取16位大写字母的字符串return ''.join([random.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.decode()):return ''.join(random.choice(chars)for i in range(length))def main():gtoken = pyotp.random_base32() # google token valueprint (gtoken)t = pyotp.TOTP(gtoken,8) # 通过 pyotp 生产TOTP的token第二个参数设置 token的位数print (t.now())print (get_totp_token(gtoken)) # 通过 自定义算法 生产TOTP的tokenprint('\n')gpasswd = random_base32() # GenPassword()print (gpasswd)t = pyotp.TOTP(gpasswd,8)print (t.now()) print (get_totp_token(gpasswd))email = GenPassword()get_qrcode(email)print (email)if __name__ =='__main__':main()
自定义TOTP方法,实现google的TOTP令牌token相关推荐
- MVC Razor:自定义Helper方法
在使用自定义Helper方法时,开始我试了很多次都不成功一直报错"找不到WebMatrix.WebData.dll.WebMatrix.Data.dll". 应该是一个bug,估计 ...
- 何时使用自定义HTTP 方法
何时使用自定义HTTP 方法 问题描述 您想知道使用自定义HTTP 方法的影响. 解决方案 避免使用非标准的自定义HTTP 方法,因为引入新方法后,就不能依赖那些只了解标准HTTP 方法的现有软件了. ...
- object类中的equals与自定义equals方法详解
object类中的equals与自定义equal方法详解 1.this怎么理解?this == obj表示什么? this就是当前你new出来的对象,这里指谁调用equal方法this指的就是谁,ob ...
- Python基础入门:正则re.sub使用自定义替换方法
在使用正则替换时,有时候需要将匹配的结果做对应处理,便可以使用自定义替换方法. re.sub的用法为: re.sub('匹配表达式',替换字符或替换函数,替换次数,其他参数) 例如,加入将字符串中的$ ...
- 为record类型自定义Equals方法
前言 record类型,这是一种新引用类型,而不是类或结构.record与类不同,区别在于record类型使用基于值的相等性. 例如: public record DemoRecord(int id) ...
- PHP发送数据到指定方法,php通过header发送自定义数据方法_php技巧
下面小编就为大家分享一篇php通过header发送自定义数据方法,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 本文将介绍如何通过header发送自定义数据.发送请求时,除了可以使用 ...
- PyTorch框架学习七——自定义transforms方法
PyTorch框架学习七--自定义transforms方法 一.自定义transforms注意要素 二.自定义transforms步骤 三.自定义transforms实例:椒盐噪声 虽然前面的笔记介绍 ...
- java自定义一个方法,用于返回两个整数的和
java自定义一个方法,用于返回两个整数的和 /*** 自定义一个方法* 用于返回两个整数的和*/ public class Test17 {public static int getSum(int ...
- BootstrapTable自定义ajax方法
bootstrapTable可以自定义ajax方法,通过ajax请求获得数据返回展示在bootstrapTable表格中,这种方式我自认为比较简单常用.本篇还加了简单增删改操作,获得表格选中的数据,以 ...
- django调用python脚本返回_讲解django rest framework 自定义返回方法
讲解django rest framework 自定义返回方法 大家在用Django Rest Framework的时候会发现默认继承后,增删改查的返回信息都是一段data,这是因为我实际是状态码和信 ...
最新文章
- 检测是否输入字母c语言程序,C语言判断字符是否为可打印字符的方法
- 行业观察丨激荡二十年——货代软件1999—2019
- EtherCAT 网站链接
- Django之form组件!
- python进阶09并发之五生产者消费者
- 固定于计算机主机,一种便于固定的计算机主机的制作方法
- CentOS 7.5基于Docker部署4.2 版本的zabbix监控平台
- Java基础篇:什么是异常,异常处理的基础是什么?
- 自己动手写操作系统 ----总计
- 项目过程管理(八)延期和需求变更
- 怎么按要求对PDF文件进行拆分?PDF拆分教程来了
- moba寻路_Dota2小技巧:从小兵仇恨到寻路机制
- Aspose.Word企业案例:Progetto Adele 使用 Aspose API 从预定义模板自动生成 Word 和 PDF 文件
- 投影仪不能显示桌面图标(文字)
- “橄榄型”人口结构制约消费增长
- 嵌入式软件之裸板与驱动调试
- JS: onfocus和onblur事件应用举例
- 《炬丰科技-半导体工艺》薄膜晶体管中的光刻技术
- Nacos2.0启动报错:Your project setup is incompatible with our requirements due to following reasons:
- LTH7R锂电池充电管理IC技术分享
热门文章
- 如果不调用系统接口,VC也可以不需要vcredist
- Acrobat将pdf转换成图片之坑爹货
- 创建一个动物类,具有name.age.sex,从键盘输入动物的信息的同时使用io流保存这些信息到d:\\1.txt,并且将这些信息存放入动物的对象,存放入一个TreeSet集合(要求根据年龄进行排序)
- java中的多态是什么_java中多态是什么意思?
- 使用miniblink 在程序中嵌入浏览器
- 国外超级计算机园区,探秘全球最强超级计算机“神威 太湖之光”
- 一分钟学会python的__setitem__方法
- 结构体与指针(使用malloc)
- Love You表白代码
- The Beginning开始