python google auth totp_Google Authenticator TOTP原理详解(以Python为例)「建议收藏」

python google auth totp_Google Authenticator TOTP原理详解(以Python为例)「建议收藏」如果有疑问,请点击此处,然后发表评论交流,作者会及时回复(也可以直接在当前文章评论)。——-谢谢您的参考,如有疑问,欢迎交流一、原理详解(图片可以点击然后放大查看)二、验证1、下载Google谷歌身份验证器。2、通过Python的qrcode和pyotp模块生成二维码。3、然后使用下载的谷歌身份验证器扫描生成的二维码如果没有谷歌服务,则选择输入秘钥,在账户明处填入name参数,在秘…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

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

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

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

python google auth totp_Google Authenticator TOTP原理详解(以Python为例)「建议收藏」

二、 验证

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

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

python google auth totp_Google Authenticator TOTP原理详解(以Python为例)「建议收藏」

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222909.html原文链接:https://javaforall.net

(0)
上一篇 2025年7月2日 下午8:43
下一篇 2025年7月2日 下午9:22


相关推荐

  • java并发编程实战_java解决并发问题

    java并发编程实战_java解决并发问题Executors  在Java5之后,并发编程引入了一堆新的启动、调度和管理线程的API。Executor框架便是Java5中引入的,其内部使用了线程池机制,它在java.util.cocurrent包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。因此,在Java5之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好…

    2025年10月24日
    8
  • PyCharm安装第三方库图解

    PyCharm安装第三方库图解无摘要

    2026年3月27日
    1
  • 查看服务器硬件配置信息命令_服务器硬件参数

    查看服务器硬件配置信息命令_服务器硬件参数本次由于需要搭建一套环境,但是所需硬件配置不足,需要进行统计采购。那么就需要得知服务器现有配置,所以这次会介绍些常用的命令和工具来查询硬件信息。其实也可以通过像DELL厂商的IDRAC控制台来获取这些

    2022年8月2日
    14
  • 查看本机上的端口使用情况netstat -an「建议收藏」

    查看本机上的端口使用情况netstat -an「建议收藏」1.查找本机上的端口使用情况netstat-an2.查找指定端口的使用情况C:\Windows\System32>netstat-ano|find"8002"

    2022年7月2日
    47
  • VMware中安装系统提示没有可用的映像(No image available)

    VMware中安装系统提示没有可用的映像(No image available)今天新建了个虚机在装系统的时候提示“没有可用的映像”之所以会出现这种情况是因为在新建虚机的时候选择的设置不同导致的,此处不管选第一项还是第二项都会虚机设置中多了一个软盘的配置项,而这个选项默认的勾选就是导致上面没有可用镜像的真正元凶。网上一查这个问题很多都说是开始迅速按F2或者ESC进BIOS修改默认启动顺序,但即使你这么设置了但依旧是无济于事的,所以要解决这个问题…

    2022年6月25日
    31
  • MySQL索引原理以及查询优化「建议收藏」

    一、介绍1.什么是索引?一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语

    2022年3月29日
    56

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号