ab990511 2019-07-23 00:28 采纳率: 0%
浏览 610

谷歌验证器-怎样通过时间和验证码获取谷歌验证器的密钥?

谷歌验证的密钥忘了
请问怎样才可以通过时间和对应的验证码算出16位的密钥?

  • 写回答

1条回答 默认 最新

  • 只想当个程序猿 2023-06-06 09:08
    关注
    1. 找到之前绑定谷歌验证器的网站或应用程序;
    2. 打开你的谷歌验证器,当前时间和上一个验证的时间都显示在屏幕上;
    3. 输入当前时间和谷歌验证器提供的验证码,记录下这个验证码;
    4. 等待验证器的下一个验证码生成,记录下这个验证码;
    5. 计算这两个验证码之间的时间差(单位为 30 秒),记为 T, 并将这个时间差转换成时间戳;
    6. 使用时间戳和之前记录的两个验证码计算出验证码的组合,即初始的 16 位密钥。

    下面是一个示例代码:

    import hmac
    import base64
    import struct
    import hashlib
    
    # 输入之前记录的两个验证码和时间戳
    code1 = '123456'  # 第一个验证码
    code2 = '654321'  # 第二个验证码
    timestamp = 1633486177  # 时间戳
    
    # 计算时间戳的时间差
    timestep = int(timestamp / 30)
    
    # 计算密钥的初始值
    secret = base64.b32decode('<your-secret-key>')
    msg = struct.pack('>Q', timestep)
    h = hmac.new(secret, msg, hashlib.sha1).digest()
    o = h[19] & 15
    h = (struct.unpack('>I', h[o:o + 4])[0] & 0x7fffffff) % 1000000
    
    # 通过两个验证码计算密钥
    for _ in range(0, 9999):
        msg = struct.pack('>Q', timestep - _) # 逆推时间戳
        h = hmac.new(secret, msg, hashlib.sha1).digest()
        o = h[19] & 15
        code = str((struct.unpack('>I', h[o:o + 4])[0] & 0x7fffffff) % 1000000).zfill(6)
        if code == code1:
            print('Initial key:', secret)
            print('Time step:', timestep - _)
            print('Code:', code)
            break
    

    在这个示例中,我们假设已经记录了两个验证码为 '123456' 和 '654321',以及时间戳为 1633486177。我们反推出时间戳的时间差为 54449539,通过这个时间差和初始密钥计算出初始验证码,然后在逆推时间戳并计算每个时间戳对应的验证码,直到找到与第一个验证码相等的验证码为止,这个时候对应的时间戳就是初始时间。

    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!