開發平臺加解密&鑑權原理

    一個網站要保證安全,加密、防篡改、身份識別等是起碼的要求。算法

有幾個問題:

  1. https 爲何公網必定要用https ?
  2. https 什麼原理?
  3. https 爲何要用對稱加密+非對稱加密?
  4. https 會讓請求變慢嗎?
  5. 爲何不能只用非對稱加密?
  6. 爲何須要數字證書?
  7. 有了https ,能作到加密,防篡改,身份識別嗎?
  8. 怎麼作鑑權? …

首先, 爲何要用https,純http,用tcpdump,wirehsark 等軟件抓包,根據http 協議規範,能夠很簡單看清每一個數據包,也能夠很輕鬆的篡改數據,動態型網站這是很是危險的。所以對傳輸數據加密是很是有必要的,因而有了https。瀏覽器

https 什麼原理?

能夠參考一個連接看下對稱加密和非對稱加密加密解密的壓測分析:https://blog.csdn.net/wowotuo/article/details/80295586 。 結論是對稱加密遠快於非對稱加密,而非對稱加密很是慢。那https 若是採用純非對稱加密,若是包太大,就難以接受了。那https 能不能利用非對稱加密的安全性,用利用對稱加密的速度?這是能夠的, https 的原理究竟是怎樣呢?參考圖:安全

    1. 服務端非對稱加密的公鑰A、私鑰A’。
    1. 客戶端發起請求,服務端返回公鑰A明文給傳客戶端。
    1. 客戶端隨機生成一個用於對稱加密的密鑰X,用公鑰A加密後傳給服務端。
    1. 服務端拿到後用私鑰A’解密獲得密鑰X,保存後將sessionId 返回客戶端。
    1. 這樣雙方就都擁有密鑰X了,且別人沒法知道它。以後雙方全部數據都用密鑰X加密解密。

理解了https 的原理能夠知道,並非每一個body 都在用非對稱加密算法加解密,而是用的對稱加密算法在加密解密(部分瀏覽器會存在一個文件中,能夠用於抓包),而後對稱加密解密很快,速度比純http 慢一點,可是並不會慢多少。服務器

爲何要有數字證書?

服務端給客戶端給公鑰,並非直接給公鑰,而是給的證書,這是爲何?由於公鑰可能被中間人篡改,因此爲了公鑰可信,證書會有公鑰和私鑰對公鑰hash加密後一個數字簽名,服務端拿着公鑰對數字簽名解密,若是和公鑰hash 對的上,就說明公鑰可靠。具體參考,https://zhuanlan.zhihu.com/p/43789231 session

如何鑑權?

https 能身份識別嗎?其實只能作到單向識別,想鑑權,其實不夠,咱們還須要其餘方式。常見的鑑權方式有哪些?tcp

類md5鑑權

客戶端和服務端使用一樣的簽名方式,服務器對請求算的結果和客戶端傳遞的值進行對比,就能夠鑑權。這裏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鑑權

還有能夠利用rsa 進行簽名,用對方公鑰加密,傳給對方,對方用本身的公鑰加密,本身用本身的私鑰對對方傳來數據進行解密。這種方式在body 很大的時候有缺點,由於非對稱加解密會很慢,優勢是相對安全,據瞭解,有部分大廠會使用這種方式。

其實,是否是能夠借鑑https ,用一種非對稱+對稱加密的方式鑑權。目前用第一種類md5 方式更多。

相關文章
相關標籤/搜索