很多人都知道Android數(shù)據(jù)需要加密,畢竟反編譯、抓包,你懂的,可是有時候不知道從何入手,比如菜鳥的我,經(jīng)過這幾天的折騰之后,我整理了一些思路,有不對的地方,還請多多指點。
1、混淆文件:這個比較簡單,不知道如何混淆的,推薦?? http://www.lxweimin.com/p/f3455ecaa56e
2、加固:APP上線之前最好做一下加固,常用的有:360加固寶,愛加密等
3、HTTPS:現(xiàn)在很多APP都用HTTPS作為網(wǎng)絡傳輸?shù)谋WC,防止中間人攻擊,提高數(shù)據(jù)傳輸?shù)陌踩裕ㄓ肦etrofit的網(wǎng)絡請求框架的,要加上HTTPS也不是什么難事,推薦 http://www.lxweimin.com/p/16994e49e2f6 ,這里說的HTTPS是指自簽的)
4、如果你沒用HTTPS的話,為了確保傳輸安全,還需對傳輸?shù)臄?shù)據(jù)進行加密,這里我推薦用AES+RSA進行加密,(不知道這兩種加密算法的自行百度一下,了解一下原理),我畫了一張流程圖:
?具體過程:是先由服務器創(chuàng)建RSA密鑰對,RSA公鑰保存在安卓的so文件里面,服務器保存RSA私鑰。而安卓創(chuàng)建AES密鑰(這個密鑰也是在so文件里面),并用該AES密鑰加密待傳送的明文數(shù)據(jù),同時用接受的RSA公鑰加密AES密鑰,最后把用RSA公鑰加密后的AES密鑰同密文一起通過Internet傳輸發(fā)送到服務器。當服務器收到這個被加密的AES密鑰和密文后,首先調(diào)用服務器保存的RSA私鑰,并用該私鑰解密加密的AES密鑰,得到AES密鑰。最后用該AES密鑰解密密文得到明文。(用Retrofit的網(wǎng)絡請求框架的,要加密參數(shù)和解密服務器傳輸過來的數(shù)據(jù)需自定義Converter,推薦http://blog.csdn.net/zr940326/article/details/51549310)
5、so文件:ndk開發(fā)的so,可以存放一些重要的數(shù)據(jù),如:密鑰、私鑰、API_KEy等,不過這里我建議大家使用分段存放,C層(so文件)+String文件(string.xml)+gradle文件,用的時候再拼接合并,還有如上圖所示,AES的加密算法是放在C層進行實現(xiàn)的,這樣也是最大程度保護我們數(shù)據(jù)的安全
Q:公鑰傳輸是否有安全問題?(RSA key)R:固定key,也就是保存在so文件中,理論上不會不安全,當然也可以動態(tài)從服務器獲取,但傳輸不安全(前提不是https)
Q:AES key存儲在哪里比較好?R:分段存放,C層(so文件)+String文件(string.xml)+gradle文件;也可以從服務獲取
我覺得思路、方案是最重要的,代碼實現(xiàn)相對來說還是比較容易的!