谷歌验证的密钥忘了
请问怎样才可以通过时间和对应的验证码算出16位的密钥?
1条回答 默认 最新
- 只想当个程序猿 2023-06-06 09:08关注
- 找到之前绑定谷歌验证器的网站或应用程序;
- 打开你的谷歌验证器,当前时间和上一个验证的时间都显示在屏幕上;
- 输入当前时间和谷歌验证器提供的验证码,记录下这个验证码;
- 等待验证器的下一个验证码生成,记录下这个验证码;
- 计算这两个验证码之间的时间差(单位为 30 秒),记为 T, 并将这个时间差转换成时间戳;
- 使用时间戳和之前记录的两个验证码计算出验证码的组合,即初始的 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 请完成下列相关问题!