授权

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

给每个用户发一个令牌(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不容易被逆向的基础上。

原文地址:https://www.cnblogs.com/weiyinfu/p/9059640.html