zoukankan      html  css  js  c++  java
  • 谷歌身份认证 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')
    

      

  • 相关阅读:
    markown 画图
    C++ 结构体指针
    C++指针详解
    C++ 中类对象与类指针的区别
    Java面向对象㈠ -- 封装
    path和classpath
    "System.Web" 中不存在类型或命名空间
    ASP.NET 后台不识别ASPX中的控件
    asp.net中的<%%>形式的详细用法实例讲解
    ASP.NET前台JS与后台CS函数如何互相调用
  • 原文地址:https://www.cnblogs.com/idktp/p/11137653.html
Copyright © 2011-2022 走看看