在服務器與終端設備進行HTTP通訊時,常常會被網(wǎng)絡抓包蜡饵、反編譯(Android?APK反編譯工具)等技術得到HTTP通訊接口地址和參數(shù)。為了確保信息的安全,我們采用AES+RSA組合的方式進行接口參數(shù)加密和解密鬓梅。
1.關于RSA加密機制:公鑰用于對數(shù)據(jù)進行加密,私鑰對數(shù)據(jù)進行解密谨湘,兩者不可逆绽快。公鑰和私鑰是同時生成的,一一對應紧阔。比如:A擁有公鑰坊罢,B擁有公鑰和私鑰。A將數(shù)據(jù)通過公鑰進行加密后擅耽,發(fā)送密文給B活孩,B可以通過私鑰和公鑰進行解密。
2.AES加密也叫對稱加密:A用密碼對數(shù)據(jù)進行AES加密后乖仇,B用同樣的密碼對密文進行AES解密憾儒。
?具體操作方法:
1.在終端中采用openssl方式輸入密鑰的相關屬性(公司名询兴、郵箱等),然后在終端當前所在的地址下起趾,生成公鑰和私鑰共7個文件(7個文件如何使用請看附錄的拓展了鏈接)蕉朵。
2.此時假設Android客戶端擁有公鑰PublicKey,服務器端擁有公鑰PublicKey和私鑰PrivateKey。
3.安卓發(fā)送請求到服務器端:安卓隨機生成Byte[]隨機密碼阳掐,假設RandomKey=“123456”始衅,通過AES算法,對Json數(shù)據(jù)利用進行加密缭保。
4.但是此刻服務器并不知道客戶端的RandomKey是什么汛闸,因此需要同時將Randomkey傳給服務器,否則服務器無法通過AES對Json數(shù)據(jù)進行解密艺骂。但是如果直接發(fā)送請求诸老,Randomkey就會暴露,所以要對RandomKey進行不可逆的RSA加密钳恕。
5.安卓將使用Randomkey進行AES加密的Json數(shù)據(jù)别伏,和使用PublicKey進行RSA加密的RandomKey通過HTTP傳送到服務器端。數(shù)據(jù)請求工作完成忧额。
6.服務器端接收到AES加密的Json數(shù)據(jù)和Rsa加密的RandomKey數(shù)據(jù)厘肮。
7.服務器通過私鑰PrivateKey對加密后的RandomKey進行Rsa解密。得到安卓生成的原始Randomkey睦番。
8.利用原始的RandomKey對加密后的Json數(shù)據(jù)進行AES對稱解密类茂。至此已經(jīng)得到安卓端發(fā)過來的原始Json數(shù)據(jù)。進行常規(guī)的服務器業(yè)務操作托嚣,然后將返回數(shù)據(jù)通過安卓端的RandomKey進行AES加密gouhou后巩检,Response返回。
9.安卓端接收到Response的數(shù)據(jù)后示启,利用之前本地生成的RandomKey直接進行AES解密即可兢哭。
詳細的流程圖可以查看下圖。
注意事項:
1.在實際的開發(fā)過程中夫嗓,發(fā)現(xiàn)RSA和AES有不同的密文生成標準迟螺,會不兼容IOS。IOS在RSA算法中需要的公鑰與JAVA不同啤月。詳細的解決方案請查看:http://www.cnblogs.com/makemelike/articles/3802518.html
2.AES加密不可以使用超過128Byte的KEY煮仇,因為在jdk1.7以上的版本不支持超過128Byte的KEY劳跃。
小結:從性能上來測谎仲,整個客戶端送加密數(shù)據(jù)開始到解密得到回傳的原始數(shù)據(jù)不超過300ms(Iphone4和Centos Java服務器傳輸測試)。本方案沒有采用TOKEN的方式刨仑,或許以后用到郑诺。公鑰如何更新也需要繼續(xù)完善夹姥。
附:具體的JAVA和IOS加密解密Demo遲點整理給出。