1. 程式人生 > >網路請求中常見的加密機制和加密演算法理解

網路請求中常見的加密機制和加密演算法理解

請求安全性: 伺服器端在接收到請求的時候,要主動鑑別該請求是否有效,是否可接受。

  token:已登陸使用者的識別碼     解決的問題:使用者呼叫介面時,不用每次都帶上使用者名稱和密碼,避免了頻繁在網路中傳輸密碼被截獲的風險。     使用場景:使用者登入系統時傳入使用者名稱和密碼,伺服器校驗成功之後,根據uuid等引數生成token返回給客戶端,同時把該token和該使用者的對應關係快取在伺服器端。客戶端在後續的請求介面中不用每次都傳入使用者名稱和密碼,只需要傳入token即可。伺服器會根據token確定客戶端的身份。     注意:token可設定生效時間,token失效之後,客戶端重新請求token。

  sign:介面body的簽名     解決問題:避免請求引數被惡意修改。保證了請求資料的一致性。     使用場景:客戶端和服務端約定一個簽名生成演算法。客戶端在請求介面之前呼叫簽名演算法,根據引數生成sign值。然後把sign和請求引數一併傳給伺服器。     伺服器收到到引數和簽名之後,根據請求引數,呼叫簽名演算法計算出簽名,然後比較該簽名和客戶端傳過來的簽名是否一致,如果一致,則說明請求引數未被修改過,如果不一致,則說明請求引數被修改過。

  nonce:請求中附帶的隨機數     解決問題:防止惡意程式重複向伺服器重複傳送相同的請求。     使用場景:客服端在向伺服器發出請求之前,隨機生成nonce引數。伺服器在接收到請求之後,取出nonce引數,然後去快取中查詢是否已存在nonce的值。如果存在,則說明該請求已經收到過,則 拒絕本次請求,如果不存在,則說明首次接收到該請求,正常進行處理。

  timestamp:客服端傳送請求的時間戳(timestamp一般和nonce組合使用)     解決的問題:防止伺服器端快取nonce資料量過大的問題。當伺服器快取的nonce較多時,每次查詢nonce就會耗費大量時間。通過新增請求時間戳,判斷請求時間到伺服器接收到請求的時間差是否在有效處理時間內(例如5分鐘),如果在5分鐘之內則進行處理,如果超出五分鐘則拒絕該請求。這樣,伺服器端在快取nonce的時候,可以設定nonce的快取時間為5分鐘,超出5分鐘之後,自動清除掉快取中的nonce,這樣就避免了快取大量nonce的問題。

    使用場景:客服端在發出請求時,附帶timestamp,記錄下當前的請求時間。伺服器接收到請求時,取出timestamp,判斷和當前的時間差,如果超出一定的時間(例如5分鐘),則放棄該請求。如果在5分鐘之內,則取出nonce,去快取中查詢nonce,如果已存在則拒絕掉,如果不存在則正常處理。

資料保密性: http請求的資料無論是GET還是POST都可能會被抓包獲取到資料。為了避免使用者的敏感資料被竊取,則需要對資料進行加密處理。

  AES:對稱加密演算法     使用方式:客服端和伺服器端共同確定一個用來加密和解密的祕鑰。然後客服端在請求伺服器是通過該祕鑰對資料進行加密,伺服器端在接收到請求之後使用該祕鑰對資料進行解密。     優勢:加密效率高     缺點:祕鑰需要共享給客戶端,具有洩露的風險

  RSA:非對稱加密演算法     使用方式:伺服器端生成公鑰和私鑰,把私鑰傳送給客戶端。客服端在請求伺服器是,通過公鑰對資料進行加密。伺服器端接收到請求之後,使用私鑰對加密的資料進行解密。     優勢:不需要共享私鑰,避免了私鑰洩露的風險。     劣勢:加密效率低,資料量大是較為耗時

  實際場景中,一般使用如下策略進行加密:       伺服器端通過RSA生成公鑰,然後把公鑰給客戶端。客服端在請求伺服器前, 隨機生成AES祕鑰,然後用AES祕鑰加密請求資料。之後用RSA公鑰對AES祕鑰進行加密,然後把加密之後的AES祕鑰和加密後的請求資料一起傳送給伺服器。伺服器收到請求之後,先用RSA私鑰解密出AES祕鑰,然後用AES祕鑰對請求資料進行解密,獲取請求資料。

其他常見演算法說明:    MD5:資訊摘要演算法,不是加密演算法。       加密演算法需要能夠解密出原始資料的。MD5是不可逆的,不存在解密的說法。MD5的目的是用來校驗檔案/資料是否和原始資料一致,是否被修改過。只要檔案/資料被修改過,則計算出的MD5就不一致。SHA-1類似,可以從來檔案校驗和計算數字簽名。       應用場景:作為計算sign簽名的演算法,校驗資料的一致性

  Base64:編碼規範,不是加密演算法。       其存在的目的是為了解決部分網路傳輸不支援不可見字元的問題。通過Base64編碼把資料流轉化為可列印顯示的字元,之後通過網路進行傳輸。既然是編碼,那麼就可以被解碼還原的。其類似於URL編碼,為了把一些特殊字元轉化為安全字元。       應用場景:RSA的公鑰為byte陣列,在傳給客戶端的時候 ,就可以通過Base64編碼把byte陣列轉換為字串,然後傳給客戶端。

=========================================

=========================================

----end--