一個網站要保證安全,加密、防篡改、身份識別等是起碼的要求。算法
首先, 爲何要用https,純http,用tcpdump,wirehsark 等軟件抓包,根據http 協議規範,能夠很簡單看清每一個數據包,也能夠很輕鬆的篡改數據,動態型網站這是很是危險的。所以對傳輸數據加密是很是有必要的,因而有了https。瀏覽器
能夠參考一個連接看下對稱加密和非對稱加密加密解密的壓測分析:https://blog.csdn.net/wowotuo/article/details/80295586 。 結論是對稱加密遠快於非對稱加密,而非對稱加密很是慢。那https 若是採用純非對稱加密,若是包太大,就難以接受了。那https 能不能利用非對稱加密的安全性,用利用對稱加密的速度?這是能夠的, https 的原理究竟是怎樣呢?參考圖:安全
理解了https 的原理能夠知道,並非每一個body 都在用非對稱加密算法加解密,而是用的對稱加密算法在加密解密(部分瀏覽器會存在一個文件中,能夠用於抓包),而後對稱加密解密很快,速度比純http 慢一點,可是並不會慢多少。服務器
服務端給客戶端給公鑰,並非直接給公鑰,而是給的證書,這是爲何?由於公鑰可能被中間人篡改,因此爲了公鑰可信,證書會有公鑰和私鑰對公鑰hash加密後一個數字簽名,服務端拿着公鑰對數字簽名解密,若是和公鑰hash 對的上,就說明公鑰可靠。具體參考,https://zhuanlan.zhihu.com/p/43789231 session
https 能身份識別嗎?其實只能作到單向識別,想鑑權,其實不夠,咱們還須要其餘方式。常見的鑑權方式有哪些?tcp
客戶端和服務端使用一樣的簽名方式,服務器對請求算的結果和客戶端傳遞的值進行對比,就能夠鑑權。這裏access key 用做識別用戶,secret key 是鹽,也能夠理解成密碼。這裏不少開放雲平臺都是採用相似的加密算法,好比騰訊雲採用的TC3-HMAC-SHA256 簽名方法,參考連接:https://cloud.tencent.com/document/product/862/37573 。網站
最簡單的驗籤方式是使用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 。咱們能對接口鑑權了後,有個問題,當不一樣客戶有不一樣權限時,server 怎麼識別不一樣的客戶?這裏access key 就起做用了,server 維護個字典,每一個access key 對應一個 secret key , 就能夠區分開客戶。url
server 原理相似:.net
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
還有能夠利用rsa 進行簽名,用對方公鑰加密,傳給對方,對方用本身的公鑰加密,本身用本身的私鑰對對方傳來數據進行解密。這種方式在body 很大的時候有缺點,由於非對稱加解密會很慢,優勢是相對安全,據瞭解,有部分大廠會使用這種方式。
其實,是否是能夠借鑑https ,用一種非對稱+對稱加密的方式鑑權。目前用第一種類md5 方式更多。