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

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

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

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

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

二、 验证

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

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

python google auth totp_Google Authenticator TOTP原理详解以Python为例)「建议收藏」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工作原理 TOTPTime-Based One-Time Password)

import hmac

import hashlib

import base64

import struct

import time

import pyotp

# setup 1 : base32 secret

Secret = ‘userxiaosheng’

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

K = base64.b32decodeSecret,True)

# setup 2 : get current timestamp

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

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

# setup 3 : start hmac-sha1

# hmac = SHA1secret + SHA1secret + input))

H = hmac.newK,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 # bin15)=00001111=0b1111

DynamicPasswd = strstruct.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 = str0) + strDynamicPasswd) if lenDynamicPasswd) < 6 else DynamicPasswd

# passwd = passwd if lenpasswd) < 6 else str0) + strpasswd)

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

printTOTP)

2、生成二维码

from qrcode import QRCode

from qrcode import constants

Content = pyotp.totp.TOTPSecret).provisioning_uriname=’xiaosheng’, issuer_name=”Verfiy Code”)

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

qr = QRCodeversion=1,

error_correction=constants.ERROR_CORRECT_L,

box_size=6,

border=4,)

qr.add_dataContent)

qr.makefit=True)

img = qr.make_image)

img.save‘./GoogleQR.png’)

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

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

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