参考链接: 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相关推荐

  1. MVC Razor:自定义Helper方法

    在使用自定义Helper方法时,开始我试了很多次都不成功一直报错"找不到WebMatrix.WebData.dll.WebMatrix.Data.dll". 应该是一个bug,估计 ...

  2. 何时使用自定义HTTP 方法

    何时使用自定义HTTP 方法 问题描述 您想知道使用自定义HTTP 方法的影响. 解决方案 避免使用非标准的自定义HTTP 方法,因为引入新方法后,就不能依赖那些只了解标准HTTP 方法的现有软件了. ...

  3. object类中的equals与自定义equals方法详解

    object类中的equals与自定义equal方法详解 1.this怎么理解?this == obj表示什么? this就是当前你new出来的对象,这里指谁调用equal方法this指的就是谁,ob ...

  4. Python基础入门:正则re.sub使用自定义替换方法

    在使用正则替换时,有时候需要将匹配的结果做对应处理,便可以使用自定义替换方法. re.sub的用法为: re.sub('匹配表达式',替换字符或替换函数,替换次数,其他参数) 例如,加入将字符串中的$ ...

  5. 为record类型自定义Equals方法

    前言 record类型,这是一种新引用类型,而不是类或结构.record与类不同,区别在于record类型使用基于值的相等性. 例如: public record DemoRecord(int id) ...

  6. PHP发送数据到指定方法,php通过header发送自定义数据方法_php技巧

    下面小编就为大家分享一篇php通过header发送自定义数据方法,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 本文将介绍如何通过header发送自定义数据.发送请求时,除了可以使用 ...

  7. PyTorch框架学习七——自定义transforms方法

    PyTorch框架学习七--自定义transforms方法 一.自定义transforms注意要素 二.自定义transforms步骤 三.自定义transforms实例:椒盐噪声 虽然前面的笔记介绍 ...

  8. java自定义一个方法,用于返回两个整数的和

    java自定义一个方法,用于返回两个整数的和 /*** 自定义一个方法* 用于返回两个整数的和*/ public class Test17 {public static int getSum(int ...

  9. BootstrapTable自定义ajax方法

    bootstrapTable可以自定义ajax方法,通过ajax请求获得数据返回展示在bootstrapTable表格中,这种方式我自认为比较简单常用.本篇还加了简单增删改操作,获得表格选中的数据,以 ...

  10. django调用python脚本返回_讲解django rest framework 自定义返回方法

    讲解django rest framework 自定义返回方法 大家在用Django Rest Framework的时候会发现默认继承后,增删改查的返回信息都是一段data,这是因为我实际是状态码和信 ...

最新文章

  1. 检测是否输入字母c语言程序,C语言判断字符是否为可打印字符的方法
  2. 行业观察丨激荡二十年——货代软件1999—2019
  3. EtherCAT 网站链接
  4. Django之form组件!
  5. python进阶09并发之五生产者消费者
  6. 固定于计算机主机,一种便于固定的计算机主机的制作方法
  7. CentOS 7.5基于Docker部署4.2 版本的zabbix监控平台
  8. Java基础篇:什么是异常,异常处理的基础是什么?
  9. 自己动手写操作系统 ----总计
  10. 项目过程管理(八)延期和需求变更
  11. 怎么按要求对PDF文件进行拆分?PDF拆分教程来了
  12. moba寻路_Dota2小技巧:从小兵仇恨到寻路机制
  13. Aspose.Word企业案例:Progetto Adele 使用 Aspose API 从预定义模板自动生成 Word 和 PDF 文件
  14. 投影仪不能显示桌面图标(文字)
  15. “橄榄型”人口结构制约消费增长
  16. 嵌入式软件之裸板与驱动调试
  17. JS: onfocus和onblur事件应用举例
  18. 《炬丰科技-半导体工艺》薄膜晶体管中的光刻技术
  19. Nacos2.0启动报错:Your project setup is incompatible with our requirements due to following reasons:
  20. LTH7R锂电池充电管理IC技术分享

热门文章

  1. 如果不调用系统接口,VC也可以不需要vcredist
  2. Acrobat将pdf转换成图片之坑爹货
  3. 创建一个动物类,具有name.age.sex,从键盘输入动物的信息的同时使用io流保存这些信息到d:\\1.txt,并且将这些信息存放入动物的对象,存放入一个TreeSet集合(要求根据年龄进行排序)
  4. java中的多态是什么_java中多态是什么意思?
  5. 使用miniblink 在程序中嵌入浏览器
  6. 国外超级计算机园区,探秘全球最强超级计算机“神威 太湖之光”
  7. 一分钟学会python的__setitem__方法
  8. 结构体与指针(使用malloc)
  9. Love You表白代码
  10. The Beginning开始