开放的平台,须要对每一个客户进行鉴权,通常会提供access key 和 secret key ,这里原理是如何?python
首先,咱们为何要进行鉴权,鉴权的目的是防止请求被篡改,能识别是哪一个客户发的请求。要达到这两个目的,咱们可使用常见的签名算法。客户端和服务端使用一样的签名方式,服务器对请求算的结果和客户端传递的值进行对比,就能够鉴权。这里access key 用做识别用户,secret key 是盐。算法
最简单的方式是使用md5作单向加密:md5(msg),可是这种粗暴的加密方式的缺点就是能够暴力破解。而后升级的作法就是加盐。服务器
import hmac message = 'messege' #和url,时间戳等固定参数有关 key = 'sdfsdfwfahesdfsdfsdfgwgdfgd' # 随机字符串 h = hmac.new(key, message, digestmod='MD5') sign = h.hexdigest()
客户端和服务器约定使用相同的随机字符串做为salt ,这样,sign传递到server 后,server 使用相同的算法对提取的参数作相同运算,便可得到sign, 做为对比便可知道是否鉴权经过。咱们经常使用的secret key 通常就是salt 。session
咱们能对接口鉴权了后,有个问题,当不一样客户有不一样权限时,server 怎么识别不一样的客户?这里access key 就起做用了,server 维护个字典,每一个access key 对应一个 secret key , 就能够区分开客户。加密
伪代码以下:url
client: sign = hmac.new(secret_key, msg, digestmod='MD5') 请求体: header { timestamp: 123, sign : 'sdfafwgsdkxsdfgasidfoshdosdhfsdgsdgs' access_key : 'kfjuwhsnssidofowsjksosdufkgsdofiiif' } body { msg: 'msg' } server : dict = { access_key1 : secrect_key1, access_key2 : secrect_key2 } #按客户维度维护的字典,和session的性质相似 import hmac access_key = req.header.get(access_key) key = dict[access_key] message = req.body.get(msg) h = hmac.new(key, message, digestmod='MD5') #为增长复杂度,这里,会对message 混杂时间戳,uri等固定参数 sign = h.hexdigest() if sign == req.header.get('sign'): return true else: return false
以上就是基本的鉴权原理code