zoukankan      html  css  js  c++  java
  • 授权

    一、最简单的授权方式:令牌

    给每个用户发一个令牌(token),令牌是私有的,见到令牌如见本人。令牌其实相当于密码。
    这种方式的优点在于实现简单。
    这种方式的缺点在于token始终不变,很容易被抓包获取。

    二、一次一密

    如果每次请求token都不一样,那该多好。
    实现上需要:虽然每次请求token都不一样,但却存在一个函数f(请求参数)=常量。
    这种方式其实是非对称加密的简易实现,用散列算法实现签名。

    微信公众号采用的就是这种方式,具体代码如下所示

    import hashlib
    import uuid
    from pprint import pprint
    from time import time
    
    access_key = "12342344"
    access_secret = "234234"
    
    
    def encode():
        timestamp = str(int(time()))
        nonce = uuid.uuid1().get_hex()
        signature = hashlib.sha1(''.join(sorted([access_secret, timestamp, nonce]))).hexdigest()
        headers = {
            'X-AccessKey': access_key,
            'X-Signature': signature,
            'X-Timestamp': timestamp,
            'X-Nonce': nonce
        }
        return headers
    
    
    def decode(headers):
        user_map = {access_key: access_secret}
        k = headers.get("X-AccessKey")
        secret = user_map.get(k)
        timestamp = headers.get("X-Timestamp")
        nonce = headers.get("X-Nonce")
        signature = hashlib.sha1(''.join(sorted([secret, timestamp, nonce]))).hexdigest()
        return signature == headers.get("X-Signature")
    
    
    pprint(decode(encode()))
    
    

    实现流程:
    用时间、uuid、私钥三者排序、拼接、哈希作为最终的令牌。
    简言之,用hash(私钥+随机串)作为每次的令牌。加密简单,解密却很难。
    这种方式的安全性是建立在hash不容易被逆向的基础上。

  • 相关阅读:
    网页设计 【0834】
    Apache Commons Lang
    Arduino U8G2 OLED_SSD1306_Chart
    Arduino Adafruit_SSD1306的使用
    proteus pro 8.9 安装及汉化教程
    AD IC类元件模型的创建
    C/C++ 深入理解char * ,char ** ,char a[ ] ,char *a[] 的区别
    Arduino MLX90614
    Arduino uno mega2560
    C语言 堆和栈
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/9059640.html
Copyright © 2011-2022 走看看