动态鉴权原理

    开放的平台,须要对每一个客户进行鉴权,通常会提供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

相关文章
相关标签/搜索