動態鑑權原理

    開放的平臺,須要對每一個客戶進行鑑權,通常會提供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

相關文章
相關標籤/搜索