安全篇-AES/RSA加密機制

小鴻洋發表於2018-07-18

在伺服器與終端裝置進行HTTP通訊時,常常會被網路抓包、反編譯(Android APK反編譯工具)等技術得到HTTP通訊介面地址和引數。為了確保資訊的安全,我們採用AES+RSA組合的方式進行介面引數加密和解密。

1.關於RSA加密機制:公鑰用於對資料進行加密,私鑰對資料進行解密,兩者不可逆。公鑰和私鑰是同時生成的,一一對應。比如:A擁有公鑰,B擁有公鑰和私鑰。A將資料通過公鑰進行加密後,傳送密文給B,B可以通過私鑰和公鑰進行解密。

2.AES加密也叫對稱加密:A用密碼對資料進行AES加密後,B用同樣的密碼對密文進行AES解密。


 具體操作方法:

1.在終端中採用openssl方式輸入金鑰的相關屬性(公司名、郵箱等),然後在終端當前所在的地址下,生成公鑰和私鑰共7個檔案(7個檔案如何使用請看附錄的擴充了連結)。

2.此時假設Android客戶端擁有公鑰PublicKey,伺服器端擁有公鑰PublicKey和私鑰PrivateKey。

3.安卓傳送請求到伺服器端:安卓隨機生成Byte[]隨機密碼,假設RandomKey=“123456”,通過AES演算法,對Json資料利用進行加密。

4.但是此刻伺服器並不知道客戶端的RandomKey是什麼,因此需要同時將Randomkey傳給伺服器,否則伺服器無法通過AES對Json資料進行解密。但是如果直接傳送請求,Randomkey就會暴露,所以要對RandomKey進行不可逆的RSA加密。

5.安卓將使用Randomkey進行AES加密的Json資料,和使用PublicKey進行RSA加密的RandomKey通過HTTP傳送到伺服器端。資料請求工作完成。

6.伺服器端接收到AES加密的Json資料和Rsa加密的RandomKey資料。

7.伺服器通過私鑰PrivateKey對加密後的RandomKey進行Rsa解密。得到安卓生成的原始Randomkey。

8.利用原始的RandomKey對加密後的Json資料進行AES對稱解密。至此已經得到安卓端發過來的原始Json資料。進行常規的伺服器業務操作,然後將返回資料通過安卓端的RandomKey進行AES加密gouhou後,Response返回。

9.安卓端接收到Response的資料後,利用之前本地生成的RandomKey直接進行AES解密即可。

詳細的流程圖可以檢視下圖。


客戶端-伺服器端HTTPS資料傳輸流程圖

注意事項:

1.在實際的開發過程中,發現RSA和AES有不同的密文生成標準,會不相容IOS。IOS在RSA演算法中需要的公鑰與JAVA不同。詳細的解決方案請檢視:http://www.cnblogs.com/makemelike/articles/3802518.html

2.AES加密不可以使用超過128Byte的KEY,因為在jdk1.7以上的版本不支援超過128Byte的KEY。

小結:從效能上來測,整個客戶端送加密資料開始到解密得到回傳的原始資料不超過300ms(Iphone4和Centos Java伺服器傳輸測試)。本方案沒有采用TOKEN的方式,或許以後用到。公鑰如何更新也需要繼續完善。

附:具體的JAVA和IOS加密解密Demo遲點整理給出。



作者:東東醬醬
連結:https://www.jianshu.com/p/ec7bb7325ff2
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。

相關文章