Google Authenticator TOTP原理详解(以Python为例),手摇发电机原理图解,小生博客:http:


小生博客: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 hmacimport hashlibimport base64import structimport timeimport pyotp# setup 1 : base32 secretSecret = ‘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=0b1111DynamicPasswd = 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位则加上首位的0print(TOTP)

2、生成二维码

from qrcode import QRCodefrom qrcode import constantsContent = 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 TOTP原理详解(以Python为例)

评论关闭