zoukankan      html  css  js  c++  java
  • [Python]token的生成及验证

    hmac模块(仅在python3中可以使用)

    简介:

    HMAC是密钥相关的哈希运算消息认证码,HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。

    典型应用:

    HMAC的一个典型应用是用在“质疑/应答”(Challenge/Response)身份认证中。

    认证流程:

    (1) 先由客户端向服务器发出一个验证请求。
    (2) 服务器接到此请求后生成一个随机数并通过网络传输给客户端(此为质疑)。
    (3) 客户端将收到的随机数提供给ePass,由ePass使用该随机数与存储在ePass中的密钥进行HMAC-MD5运算并得到一个结果作为认证证据传给服务器(此为响应)。
    (4) 与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC-MD5运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户。
     
    生成token:
    import time
    import base64
    import hmac
    
    
    def generate_token(key, expire=60):
        """
        @Args:
            key: str (用户给定的key,需要用户保存以便之后验证token,每次产生token时的key 都可以是同一个key)
            expire: int(最大有效时间,单位为s)
        @Return:
            state: str
        :param key:
        :param expire:
        :return:
        """
        ts_str = str(time.time() + expire)
        ts_byte = ts_str.encode("utf-8")
        sha1_tshex_str = hmac.new(key.encode("utf-8"), ts_byte, 'sha1').hexdigest()
        token = ts_str+':'+sha1_tshex_str
        b64_token = base64.urlsafe_b64encode(token.encode("utf-8"))
    
        return b64_token.decode("utf-8")

    验证token:

    def certify_token(key, token):
        """
        @Args:
            key: str
            token: str
        @Returns:
            boolean
        :param key:
        :param token:
        :return:
        """
        token_str = base64.urlsafe_b64decode(token).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():
            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
  • 相关阅读:
    1022词法分析实验总结
    1008词法分析
    0909对编译原理的理解
    【Windows】如何判断当前鼠标是否按下左键或右键
    【Delphi】从内存(MemoryStream)使用WMP(WindowsMediaPlayer)控件播放视频音频(Play Video with WMP from MemoryStream)
    计算机基础
    对接微信公众号
    排序与搜索
    二叉树
    3- 面向对象进阶
  • 原文地址:https://www.cnblogs.com/ttkl/p/11230177.html
Copyright © 2011-2022 走看看