python3計算谷歌驗證碼
阿新 • • 發佈:2020-11-05
1. 問題
使用python3計算谷歌驗證碼(16位谷歌祕鑰,生成6位驗證碼。基於時間,每30s更新1次)
2. 程式碼
import hmac, base64, struct, hashlib, time
class CalGoogleCode():
"""計算谷歌驗證碼(16位谷歌祕鑰,生成6位驗證碼)"""
# 使用靜態方法,呼叫這個方法時,不必對類進行例項化
@staticmethod
def cal_google_code(secret, current_time=int(time.time()) // 30):
"""
:param secret: 16位谷歌祕鑰
:param current_time: 時間(谷歌驗證碼是30s更新一次)
:return: 返回6位谷歌驗證碼
"""
key = base64.b32decode(secret)
msg = struct.pack(">Q", current_time)
google_code = hmac.new(key, msg, hashlib.sha1).digest()
o = ord(chr(google_code[19])) & 15 # python3時,ord的引數必須為chr型別
google_code = (struct.unpack(">I", google_code[o:o + 4])[0] & 0x7fffffff) % 1000000
return '%06d' % google_code # 不足6位時,在前面補0
if __name__ == '__main__':
secret_key = "ABCDEFGHIJKLMNOP"
print(CalGoogleCode.cal_google_code(secret_key)) # 並未例項化CalGoogleCode,也可以呼叫它的方法
3. 注意
這是基於時間更新谷歌驗證碼,因此需要保證電腦上的時間準確。