经常会用到GoogleAuth作为二次验证码,就扒了代码看看这块逻辑如何实现的,做个笔记。
import hmac
import struct
import time
from hashlib import sha1
from urllib.parse import urlencode, quote
if __name__ == '__main__':
# account会作为标识显示在身份验证器上
account = input("please enter your account: ")
# secret用于生成秘钥
secret = input("please enter your secret: ")
# label会作为标识显示在身份验证器上
label = input("please enter your label: ")
# 将secret转换成bytes
s = 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] & 0xf
print("offset:", offset)
# 从hmac_hash中取出4个16进制字节转换为正整数(I)并取索引为[0],再与16进制0x7fffffff做与运算,最后除以10的六次方
google_code = (struct.unpack(">I", hmac_hash[offset: offset + 4])[0] & 0x7fffffff) % 10 ** 6
print(google_code)
# 若计算后结果不足6位, 则在左侧补0
google_code = f'{google_code:>06}'
print(google_code)
prefix = label
prefix += f':{account}'
ends = {
'secret': secret,
'label': label
}
base_uri = 'otpauth://totp/{prefix}?{ends}'
# 调用草料二维码生成api
caoliao_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)))
使用谷歌身份验证器扫描链接生成的二维码即可绑定。