谷歌身份認證 Python實現


import base64, time, struct, hmac, hashlib
import os


def get_google_code_by_date(secret_key):
    """
    基於時間的算法
    :param secret_key:
    :return:
    """
    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
    google_code = (struct.unpack(">I", digest[index:index + 4])[0] & 0x7fffffff) % 1000000

    return "%06d" % google_code


def get_google_code_by_time(secret_key, num):
    """
    基於計數器的算法
    :param secret_key:
    :return:
    """
    decode_secret = base64.b32decode(secret_key, True)
    # 解碼 Base32 編碼過的 bytes-like object 或 ASCII 字符串 s 並返回解碼過的 bytes。

    result = {}

    for interval_number in range(num, num + 5):
        message = struct.pack(">Q", interval_number)
        digest = hmac.new(decode_secret, message, hashlib.sha1).digest()
        index = ord(chr(digest[19])) % 16
        google_code = (struct.unpack(">I", digest[index:index + 4])[0] & 0x7fffffff) % 1000000

        result[interval_number] = "%06d" % google_code

    return result


def get_secret_key():
    """
    隨機生成secret_key
    :return:
    """
    return base64.b32encode(os.urandom(10)).decode('utf-8')

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM