在開發項目的網絡模塊時,咱們爲了保證客戶端(Client)和服務端(Server)之間的通訊安全,咱們會對數據進行加密。算法
談到網絡通訊加密,咱們能夠說出:對稱加密,非對稱加密,md5單向加密,也能提到RSA,AES128,以及MD5等專業名詞。數組
下面咱們就來講明客戶端(Client)與服務端(Server)的加密通訊邏輯。緩存
1). 客戶端將要上傳的數據以字典(Map)的方式打包,Post提交給服務器。安全
2). 服務器接收提交的數據包,經過Key-Value的形式獲取客戶端提交的值,進行處理。服務器
3). 處理結束,將數據以字典(Map)的形式打包,返回給客戶端處理。網絡
總體流程:客戶端上傳數據加密 ==> 服務器獲取數據解密 ==> 服務器返回數據加密 ==> 客戶端獲取數據解密。ui
請求安全性主要體現爲: 服務器端在接收到請求的時候,要主動鑑別該請求是否有效,是否可接受。編碼
經常使用方案以下:加密
用戶調用接口時,不用每次都帶上用戶名和密碼,避免了頻繁在網絡中傳輸密碼被截獲的風險。spa
用戶登陸系統時傳入用戶名和密碼,服務器校驗成功以後,根據uuid等參數生成token返回給客戶端,同時把該token和該用戶的對應關係緩存在服務器端。客戶端在後續的請求接口中不用每次都傳入用戶名和密碼,只須要傳入token便可。服務器會根據token肯定客戶端的身份。
token可設置生效時間,token失效以後,客戶端從新請求token。
避免請求參數被惡意修改。保證了請求數據的一致性。
客戶端和服務端約定一個簽名生成算法。客戶端在請求接口以前調用簽名算法,根據參數生成sign值。而後把sign和請求參數一併傳給服務器。服務器收到到參數和簽名以後,根據請求參數,調用簽名算法計算出簽名,而後比較該簽名和客戶端傳過來的簽名是否一致,若是一致,則說明請求參數未被修改過,若是不一致,則說明請求參數被修改過。
防止惡意程序重複向服務器重複發送相同的請求。
客服端在向服務器發出請求以前,隨機生成nonce參數。服務器在接收到請求以後,取出nonce參數,而後去緩存中查找是否已存在nonce的值。若是存在,則說明該請求已經收到過,則 拒絕本次請求,若是不存在,則說明首次接收到該請求,正常進行處理。
timestamp機制通常和nonce組合使用
防止服務器端緩存nonce數據量過大的問題。當服務器緩存的nonce較多時,每次查找nonce就會耗費大量時間。經過添加請求時間戳,判斷請求時間到服務器接收到請求的時間差是否在有效處理時間內(例如5分鐘),若是在5分鐘以內則進行處理,若是超出五分鐘則拒絕該請求。這樣,服務器端在緩存nonce的時候,能夠設置nonce的緩存時間爲5分鐘,超出5分鐘以後,自動清除掉緩存中的nonce,這樣就避免了緩存大量nonce的問題。
客服端在發出請求時,附帶timestamp,記錄下當前的請求時間。服務器接收到請求時,取出timestamp,判斷和當前的時間差,若是超出必定的時間(例如5分鐘),則放棄該請求。若是在5分鐘以內,則取出nonce,去緩存中查找nonce,若是已存在則拒絕掉,若是不存在則正常處理。
數據保密性: http請求的數據不管是GET仍是POST均可能會被抓包獲取到數據。爲了不用戶的敏感數據被竊取,則須要對數據進行加密處理。
客服端和服務器端共同肯定一個用來加密和解密的祕鑰。而後客服端在請求服務器是經過該祕鑰對數據進行加密,服務器端在接收到請求以後使用該祕鑰對數據進行解密。
加密效率高
祕鑰須要共享給客戶端,具備泄露的風險
服務器端生成公鑰和私鑰,把私鑰發送給客戶端。客服端在請求服務器是,經過公鑰對數據進行加密。服務器端接收到請求以後,使用私鑰對加密的數據進行解密。
不須要共享私鑰,避免了私鑰泄露的風險。
加密效率低,數據量大時較爲耗時