一、最简单的授权方式:令牌
给每个用户发一个令牌(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不容易被逆向的基础上。