zoukankan      html  css  js  c++  java
  • python 产生token及token验证

    1.前言

    最近在做微信公众号开发在进行网页授权时,微信需要用户自己在授权url中带上一个类似token的state的参数,以防止跨站攻击。
    在经过再三思考之后,自己试着实现一个产生token和验证token的方案。接下就把code贴出来。希望读者指导一下。

    2.产生token

    原理:

    通过hmac sha1 算法产生用户给定的key和token的最大过期时间戳的一个消息摘要,
    将这个消息摘要和最大过期时间戳通过":"拼接起来,再进行base64编码,生成最终的token

    实现:

    import time
    import base64
    import hmac
    
    def generate_token(key, expire=3600):
        r'''
            @Args:
                key: str (用户给定的key,需要用户保存以便之后验证token,每次产生token时的key 都可以是同一个key)
                expire: int(最大有效时间,单位为s)
            @Return:
                state: str
        '''
        ts_str = str(time.time() + expire)
        ts_byte = ts_str.encode("utf-8")
        sha1_tshexstr  = hmac.new(key.encode("utf-8"),ts_byte,'sha1').hexdigest() 
        token = ts_str+':'+sha1_tshexstr
        b64_token = base64.urlsafe_b64encode(token.encode("utf-8"))
        return b64_token.decode("utf-8")
    
    

    3.验证token

    原理:

    将token进行base64解码,通过token得到token最大过期时间戳和消息摘要。判断token是否过期。
    如没过期才将 从token中的取得最大过期时间戳进行hmac sha1 算法运算(注意这里的key要与产生token的key要相同),
    最后将产生的摘要与通过token取得消息摘要进行对比, 如果两个摘要相等,则token有效,否则token无效 。

    实现:

    import time
    import base64
    import hmac
    
    def certify_token(key, token):
        r'''
            @Args:
                key: str
                token: str
            @Returns:
                boolean
        '''
        token_str = base64.urlsafe_b64decode(state).decode('utf-8')
        token_list = token_str.split(':')
        if len(token_list) != 2:
            return False
        ts_str = token_list[0]
        if float(ts_str) < time.time():
            # token expired
            return False
        known_sha1_tsstr = token_list[1]
        sha1 = hmac.new(key.encode("utf-8"),ts_str.encode('utf-8'),'sha1')
        calc_sha1_tsstr = sha1.hexdigest()
        if calc_sha1_tsstr != known_sha1_tsstr:
            # token certification failed
            return False 
        # token certification success
        return True 
    
    

    4.用法

    
    key  = "JD98Dskw=23njQndW9D"
    # 一小时后过期
    token = generate_token(key, 3600)
    
    certify_token(key, token)
    
    
    

    5.Note!!!

    本代码只能在python3.x 中运行,

  • 相关阅读:
    牛客小白月赛6 G 指纹锁 set的自动排序 模板
    牛客小白月赛6 E 对弈 思维
    牛客小白月赛6 F 发电 树状数组单点更新 求区间乘积 模板
    杭电多校第九场 hdu6424 Rikka with Time Complexity 数学
    杭电多校第十场 hdu6432 Cyclic 打表找规律
    杭电多校第十场 hdu6435 CSGO 二进制枚举子集
    二进制枚举子集模板
    C# DataTable删除行Delete与Remove的问题
    java.io.NotSerializableException错误解决方法
    Git使用gitignore建立项目过滤规则
  • 原文地址:https://www.cnblogs.com/whereareyoufrom/p/5753365.html
Copyright © 2011-2022 走看看