網絡環境,http/https 數據傳輸,有時候我們需要特別保證數據傳輸的安全性和私密性,爲了防止數據被串改和竊取,比較常見的做法,是採用https,按照ssl 協議進行加密傳輸,當然也有客戶端對請求的數據進行簽名,服務端對接收的數據進行驗籤,來達到保證數傳輸的準確性,除此之外,還有沒有其他的方案呢?
這就需要我們瞭解 非對稱加密的思想了 非對稱加密算法
基於非對稱加密的公私鑰, 客戶端可以用私鑰對傳輸的數據進行加密,服務端可以用私鑰對應的公鑰,進行解密,從而能達到要求。 JAVA實現RSA生成公私鑰/加解密/簽名驗籤
當然在公私鑰加解密的過程中,也可以附加 簽名和驗籤,來進一步保證的傳輸數據的私密性、安全性和正確性,具體思路如下:
思路方案一:
/** 私鑰加密-簽名 ——> 驗籤-公鑰解密
* 客戶端操作:
*
* 原串:{"aa":1}
*
* 私鑰加密 {"context":"aaaxxx"} aaaxxx爲 {"aa":1} 的密文
*
* 簽名並拼裝請求數據 {"context":"aaaxxx","signData":"xxyy"} xxyy爲 對 {"context":"aaaxxx"} 的簽名
*
* 服務端操作:
*
* 接收參數數據:{"context":"aaaxxx","signData":"xxyy"}
*
* 驗籤 true
*
* 公鑰解密 aaaxxx ——> {"aa":1}
*
* 執行業務
*
*/
思路方案二:
/** 簽名-私鑰加密 ——> 公鑰解密-驗籤
*
* 客戶端:
*
* 原串:{"aa":1}
*
* 簽名 {"aa":1,"signData":"xxyy"}
*
* 私鑰加密 aaaxxx
*
*
*
* 服務端:
*
* 接收的密文: aaaxxx
*
* 公鑰解密 : {"aa":1,"signData":"xxyy"}
*
* 驗籤 true
*
* 執行業務
*/
方案一和方案二隻是加解密和簽名的順序不一樣,功效上差別不大,相較於方案二,方案一額外增加了非業務字段key:contex,不算太可取,個人更傾向於方案二。