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