如果有疑问,请点击此处,然后发表评论交流,作者会及时回复(也可以直接在当前文章评论)。

-------谢谢您的参考,如有疑问,欢迎交流

一、 原理详解(图片可以点击然后放大查看)

二、 验证

1、下载Google谷歌身份验证器。

2、通过Python 的qrcode和pyotp模块生成二维码。

3、然后使用下载的谷歌身份验证器扫描生成的二维码

如果没有谷歌服务,则选择输入秘钥,在账户明处填入name参数,在秘钥处填入Secret即可。

4、对比手机上谷歌验证器显示的6位动态码,你会发现,和【原理详解】中代码计算处的6位动态码是一致的

三、 源码

1、计算Google Authenticator 6位动态码

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# Google Authenticator工作原理 TOTP(Time-Based One-Time Password)

import hmac

import hashlib

import base64

import struct

import time

import pyotp

# setup 1 : base32 secret

Secret = 'userxiaosheng'

Secret += '=' * (8-len(Secret)%8) # py3中base64模块要求字符串必须为8的倍数,不足部分使用 = 补全

K = base64.b32decode(Secret,True)

# setup 2 : get current timestamp

# int(time.time()) // 30 到当前经历了多少个30秒

C = struct.pack(">Q", int(time.time()) // 30) # 将间隔时间转为big-endian(大端序)并且为长整型的字节

# setup 3 : start hmac-sha1

# hmac = SHA1(secret + SHA1(secret + input))

H = hmac.new(K,C,hashlib.sha1).digest() # 使用hmac sha1加密,并且以字节的方式取出 = b'\x0f\x1a\xaeL\x0c\x8e\x19g\x8dv}\xde7\xbc\x95\xeal\xa3\xc1\xee'

O = H[19] & 15 # bin(15)=00001111=0b1111

DynamicPasswd = str((struct.unpack(">I", H[O:O+4])[0] & 0x7fffffff) % 1000000)

# struct.unpack('>I',h[o:o+4])[0] -- 转为big-endian(大端序)并且不为负数的数字(整数),因为转换完是一个数组,类似"(2828101188,)",所以需要[0]取出

# h[o:o+4] -- 取其中4个字节 o=10 则取索引分别为 10,11,12,13的字节

# & 0x7fffffff = 11111111 -- 与字节转换的数字做与运算

# % 1000000 -- 得出的数字与1000000相除然后取余

TOTP = str(0) + str(DynamicPasswd) if len(DynamicPasswd) < 6 else DynamicPasswd

# passwd = passwd if len(passwd) < 6 else str(0) + str(passwd)

# 如果最后得出的6位数字,首位0,可能会只输出5位数字,所以这里进行一个判断,如果是5位则加上首位的0

print(TOTP)

2、生成二维码

from qrcode import QRCode

from qrcode import constants

Content = pyotp.totp.TOTP(Secret).provisioning_uri(name='xiaosheng', issuer_name="Verfiy Code")

# 在真实环境中,name的参数应该是和Secret有关联的,这样我们才能为每个不同的用户分别计算动态验证码.

qr = QRCode(version=1,

error_correction=constants.ERROR_CORRECT_L,

box_size=6,

border=4,)

qr.add_data(Content)

qr.make(fit=True)

img = qr.make_image()

img.save('./GoogleQR.png')

标签:Google,为例,Python,Secret,TOTP,str,time,import,hmac

python google auth totp_Google Authenticator TOTP原理详解(以Python为例)相关推荐

  1. google authenticator python_Google Authenticator TOTP原理详解(以Python为例)

    http://xsboke.blog.51cto.com 如果有疑问,请点击此处,然后发表评论交流,作者会及时回复(也可以直接在当前文章评论). -------谢谢您的参考,如有疑问,欢迎交流 一. ...

  2. 视频教程-深度学习原理详解及Python代码实现-深度学习

    深度学习原理详解及Python代码实现 大学教授,美国归国博士.博士生导师:人工智能公司专家顾问:长期从事人工智能.物联网.大数据研究:已发表学术论文100多篇,授权发明专利10多项 白勇 ¥88.0 ...

  3. 字典树原理详解及其Python实现

    一.原理详解 1.初步介绍: 字典树又名前缀树,Trie树,是一种存储大量字符串的树形数据结构,经常被搜索引擎系统用于文本词频统计. 除此之外也常用于计算左右信息熵.计算点互信息. 下图演示了一个保存 ...

  4. Xgboost算法原理详解及python实现

    Xgboost算法(回归树) 1.算法原理 2.对数据的要求(无需规范化) 3.算法的优缺点 4.XGB.GBDT.LR与RF 5.python代码实现 导入相关包 读取数据并预处理 训练 贝叶斯初步 ...

  5. 随机森林原理详解及python代码实现

    随机森林(RF)算法 1.算法原理 2.对数据的要求(无需规范化) 3.算法的优缺点 4.算法需要注意的点 5.python代码实现(待更......) 导入相关包 读取数据并预处理(必须处理缺失值) ...

  6. 决策树原理详解及python代码实现

    决策树算法(信贷中常用来寻找规则) 1.算法原理 1.1 ID3(多叉树分类) 1.2 C4.5(多叉树分类) 1.3 Cart(二叉树分类+回归) 2.ID3.C4.5与Cart比较 3.算法优缺点 ...

  7. KNN算法原理详解及python代码实现

    KNN算法 算法原理 对数据的要求 算法的优缺点 算法需要注意的点 算法实现(python) 算法原理 计算待测样本与train_data的距离d并保存数组中 对d进行排序,取d最近的k个样本 统计样 ...

  8. 集成经验模态(EEMD)原理详解与python实现

    文章目录 1 经验模态分解(EMD) 1.1 本征模态函数(IMF) 1.2 sifting算法 1.3 原始序列重构 2 集成经验模态分解(EEMD) 2.1 EEMD算法步骤 集成经验模态分解的关 ...

  9. python爬取微博恶评_详解用python写网络爬虫-爬取新浪微博评论

    新浪微博需要登录才能爬取,这里使用m.weibo.cn这个移动端网站即可实现简化操作,用这个访问可以直接得到的微博id. 分析新浪微博的评论获取方式得知,其采用动态加载.所以使用json模块解析jso ...

最新文章

  1. Linux下安装Tomcat启动报错
  2. mysql对数据库的备份和还原
  3. 在ubuntu16下安装virtualenv+virtualenvwrapper
  4. C#设计模式(5)-Factory Method Pattern
  5. oracle 各种日期函数格式和操作
  6. 交换机的端口结构及端口类型
  7. 博士毕业论文英文参考文献换行_不用写毕业论文?一年制硕士真的不是闹着玩的吗...
  8. Log4j2 杀不死 Java
  9. 初学者,你应当如何学习C++以及编程-转
  10. 7 天 600 stars, Mobi.css 是如何诞生的
  11. matlab电力系统建模与仿真实验,基于MATLAB的小型电力系统的建模与仿真.doc
  12. centos安装tree命令
  13. java面向对象 封装 继承 多态
  14. 基于Python的指数基金量化投资 - 通过指数估值榜进行指数投资
  15. visio常用快捷键_Visio2019常用形状对象的快捷键及常用操作技巧举例(一)
  16. 计算机图像变为红色是什么故障,电脑显示器变成红色怎么办
  17. n维向量积(3维向量积的推广,向量算法)
  18. Vue中获取当前点击元素的父元素、子元素、兄弟元素
  19. win7电脑远程桌面连接提示已停止工作,但电脑没有蓝牙,不是受蓝牙影响,且影响电脑卡顿必须重启故障模块名称:StackHash_e1f3
  20. 将knif4j快速集成到springboot项目中

热门文章

  1. ubantu 安装redash
  2. ucint核心边缘分析_学术博客交流网络的核心—边缘结构分析实证研究.pdf
  3. android 手机安装怎么信任证书,Charles中关于手机证书安装以及信任
  4. 超实数是个“宝”,看看谁敢来抱一抱?
  5. lua能在stm32arm上运行吗_ARM版Mac将至,那么手机能运行PC操作系统吗
  6. Visdom常用功能
  7. 无线温度控制系统是如何解决传统温度监控系统存在的问题
  8. 之前是脚本方式启动nginx,现在想实现systemd方式来管理nginx服务
  9. 一个人的旅游(十一、成都、九寨沟)
  10. 递归计算(偶数求和)