安全篇-AES/RSA加密機制

在服務器與終端設備進行HTTP通信時,經常會被網絡抓包、反編譯(Android APK反編譯工具)等技術獲得HTTP通信接口地址和參數。爲了確保信息的安全,咱們採用AES+RSA組合的方式進行接口參數加密和解密。html

1.關於RSA加密機制:公鑰用於對數據進行加密,私鑰對數據進行解密,二者不可逆。公鑰和私鑰是同時生成的,一一對應。好比:A擁有公鑰,B擁有公鑰和私鑰。A將數據經過公鑰進行加密後,發送密文給B,B能夠經過私鑰和公鑰進行解密。算法

2.AES加密也叫對稱加密:A用密碼對數據進行AES加密後,B用一樣的密碼對密文進行AES解密。
安全


具體操做方法:服務器

1.在終端中採用openssl方式輸入密鑰的相關屬性(公司名、郵箱等),而後在終端當前所在的地址下,生成公鑰和私鑰共7個文件(7個文件如何使用請看附錄的拓展了連接)。網絡

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

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解密便可。

詳細的流程圖能夠查看下圖。


注意事項:

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

相關文章
相關標籤/搜索