http://xsboke.blog.51cto.com

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

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

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

二、 验证

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 authenticator python_Google Authenticator TOTP原理详解(以Python为例)相关推荐

  1. python google auth totp_Google Authenticator TOTP原理详解(以Python为例)

    如果有疑问,请点击此处,然后发表评论交流,作者会及时回复(也可以直接在当前文章评论). -------谢谢您的参考,如有疑问,欢迎交流 一. 原理详解(图片可以点击然后放大查看) 二. 验证 1.下载 ...

  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. 集成经验模态(EEMD)原理详解与python实现

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

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

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

  9. SVM算法原理详解及python实现

    SVM算法 算法原理 对数据的要求 算法的优缺点 算法需要注意的点 算法实现(python)(待更.........) 算法原理 {wTx+b>0yi=1⟺y(xi)>0wTx+b< ...

最新文章

  1. Prometheus — 软件架构
  2. 8 线程安全且高效的单例模式
  3. Linux 获取屏幕分辨率与窗口行列数(c/c++)
  4. spring cloud 调用接口间歇性返回http 500 - Internal Server Error的错误
  5. 启动hadoop遇到的datanode启动不了
  6. Kafka 异步消息也会阻塞?记一次 Dubbo 频繁超时排查过程
  7. mysql linux内核_mysql 5.7.15 vs mysql 5.6.31性能测试以及不同linux内核性能比较
  8. 管家婆打印模板设置_B端移动设计 | 打印配置
  9. php 将网页转成pdf_利用PHP将HTML页面转换成PDF文件
  10. 网站APP信息以及用户数据泄露排查方案
  11. Windows图片和传真查看器开启故障
  12. 谁是淘宝创业主力军?平均年龄26 小镇青年占比高
  13. 将字符串数组String[]转换成List的三种方法
  14. 生成token和验证token机制
  15. python怎么画人像_教你如何用Python画出心目中的自己
  16. 每天一个shell小知识(shell变量)
  17. 广东湛江3.6级地震,环境猫30秒内完成速报推送!
  18. 转转三合一验机源码+验机报告
  19. 论如何去选择合适自己的固码
  20. Turtlebot4快速入门教程-A1激光雷达检测

热门文章

  1. 不只是新车,2019上海车展还有这些彩蛋 | 一级供应商、科技公司篇
  2. mysqlbinlog配置
  3. 企业微信正式发布 与阿里“钉钉”共逐移动办公市场
  4. Beyond Compare可以进行二进制比较
  5. keynote代码高亮【转】
  6. Windows Server 2012 NIC Teaming
  7. 一个简简单单检测http服务状态的脚本
  8. Ubuntu中网络编程的环境配置
  9. php连接Access实例
  10. Numeral.js 是一个用于格式化和数字四则运算的js 库