import hmac, base64, struct, hashlib, time
def calGoogleCode(secret_key):
"""
基于时间的算法
:param secret_key:
:return:
"""
# 密钥长度非8倍数,用'='补足
lens = len(secret_key)
lenx = 8 - (lens % 4 if lens % 4 else 4)
secret_key += lenx * '='
# print(secret_key)
decode_secret = base64.b32decode(secret_key, True)
# 解码 Base32 编码过的 bytes-like object 或 ASCII 字符串 s 并返回解码过的 bytes。
interval_number = int(time.time() // 30)
message = struct.pack(">Q", interval_number)
digest = hmac.new(decode_secret, message, hashlib.sha1).digest()
index = ord(chr(digest[19])) % 16 # 注:网上材料有的没加chr,会报错
google_code = (struct.unpack(">I", digest[index:index + 4])[0] & 0x7fffffff) % 1000000
return "%06d" % google_code
if __name__ == '__main__':
print(calGoogleCode(''))
验证码错误可能原因:
1、本地时间与实际时间偏差过大,结果可能不正确。
解决方案:同步网络时间,或手动校正
2、以上代码只能处理16位验证码,若其他位数验证码需调整index计算位数
3、秘钥不是8的倍数,需要用“=”补足
本文详细介绍了基于时间的一次性密码(TOTP)算法,该算法用于生成Google身份验证器中的六位动态验证码。文章提供了Python实现代码,包括处理密钥长度、时间间隔计算、消息打包、HMAC-SHA1摘要生成及最终验证码计算等关键步骤。
3134





