Python 实现Google身份验证

本文详细介绍了基于时间的一次性密码(TOTP)算法,该算法用于生成Google身份验证器中的六位动态验证码。文章提供了Python实现代码,包括处理密钥长度、时间间隔计算、消息打包、HMAC-SHA1摘要生成及最终验证码计算等关键步骤。
部署运行你感兴趣的模型镜像
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的倍数,需要用“=”补足

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

779醒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值