经常会用到GoogleAuth作为二次验证码,就扒了代码看看这块逻辑如何实现的,做个笔记。
import hmac
import struct
import time
from hashlib import sha1
from urllib.parse import urlencode, quoteif __name__ == '__main__':# account会作为标识显示在身份验证器上account = input("please enter your account: ")# secret用于生成秘钥secret = input("please enter your secret: ")# label会作为标识显示在身份验证器上label = input("please enter your label: ")# 将secret转换成bytess = secret.encode()# 获取时间片(1990年1月1日0时开始计时,30秒为一个单位)c = struct.pack(">Q", int(time.time()) // 30)# 根据secret和时间片指定sha1算法计算hash值,返回bytes类型hash值hmac_hash = hmac.new(s, c, sha1).digest()print("hmac_hash:", len(hmac_hash))# 取出hmac_hash的第19位和0xf做”与“运算offset = hmac_hash[19] & 0xfprint("offset:", offset)# 从hmac_hash中取出4个16进制字节转换为正整数(I)并取索引为[0],再与16进制0x7fffffff做与运算,最后除以10的六次方google_code = (struct.unpack(">I", hmac_hash[offset: offset + 4])[0] & 0x7fffffff) % 10 ** 6print(google_code)# 若计算后结果不足6位, 则在左侧补0google_code = f'{google_code:>06}'print(google_code)prefix = labelprefix += f':{account}'ends = {'secret': secret,'label': label}base_uri = 'otpauth://totp/{prefix}?{ends}'# 调用草料二维码生成apicaoliao_qrcode_url = 'https://api.pwmqr.com/qrcode/create/?url={qr_content}'qr_uri = base_uri.format(prefix=prefix, ends=urlencode(ends))print(caoliao_qrcode_url.format(qr_content=quote(qr_uri)))
使用谷歌身份验证器扫描链接生成的二维码即可绑定。