版權聲明:本文爲博主原創文章,未經博主容許不得轉載。javascript
這裏先說一下APK加固
- 防止二次打包(盜版)
- 防止逆向分析
- 防止調試及注入
- 防止應用數據竊取
- 防止木馬病毒
- 防篡改(APK篡改工具:APK改之理,AndroidKiller)
以上的防禦均可以用APP加固來實現,這裏先說一下最簡單的反編譯,相信不少人都用過反編譯工具。其實咱們正常打包出來的apk就是一個壓縮包,你解壓縮或者反編譯基本就拿到了你這個應用的源代碼。反編譯工具:dex2jar(ApkToolkit) jd-gui 等。我使用的是
對你的apk解壓縮後,你能夠看到以下:
當你對你的應用進行加固之後,你再嘗試着去反編譯,我這裏以360加固爲例,你反編譯以後的獲得東西以下
未加固APK:
加固APK:
這裏你們百度確定能看到一些什麼360脫殼聖戰啊什麼的文章介紹,我想說那是扯淡的。不相信的朋友能夠按照那些文章去試試。這裏介紹一下國內的幾個加固商
固然還有其餘的加固廠商,好比百度、騰訊、阿里、通付盾、網易易盾。這裏你們喜歡用哪一個就用哪一個。騰訊和阿里雖然是IT巨頭,可是畢竟有些廠商是專業作這個的。這裏我就不作推薦了,有些加固自帶崩潰日誌,數據分析等等。使用加固後可對以上進行有效的防禦。加固APK以後:篡改後沒法正常運行、沒法正常動態調試、反動態注入沒法注入、反編譯沒法獲取到原dex代碼或完整的dex代碼、So文件的總體加密,使用自定義連接器的技術,對SO文件進行總體的加密,徹底阻止 IDA等逆向工具的靜態分析。java
組件安全
– 描述:測試客戶端是否包含後臺服務、Content Provider、第三方調用和廣播等組件,Intent權限的設置是否安全。應用不一樣組成部分之間的機密數據傳遞是否安全。程序是否竊取手機用戶的隱私信息。
– 建議:建議在開發客戶端時不要暴露內部組件,若是有特殊需求也需進行權限控制,令使用這些組件時須要申請相應權限。android
總體解決:以上客戶端程序保護可經過代碼混淆配合apk加固所有解決git
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);// 防止屏幕截屏
私密問題驗證
– 描述:驗證客戶端是否存在忘記密碼時的私密問題驗證
– 檢測:相似於QQ的私密問題驗證
– 建議:我以爲這個根據需求走,也不必定說這個就好。一個普通的APP這樣搞,用戶體驗會不好。除非你作到了QQ那種地步github
總體解決:無,一個一個搞吧,須要和後臺配合着。這裏只說一下界面劫持
@Override
protected void onPause() {
// 若程序進入後臺不是用戶自身形成的,則須要彈出警示
if (needAlarm) {
// 彈出警示信息
Toast.makeText(getApplicationContext(),
"XX的登錄界面被覆蓋,請確認登錄環境是否安全", Toast.LENGTH_SHORT).show();
}
super.onPause();
}
就是在登陸界面重寫onPause方法。這個界面劫持只須要在登陸界面作防禦。needAlarm是定義的變量,初始化爲true,而後監聽home鍵和返回鍵以及你自身登陸界面的其餘activity的跳轉。若是用戶執行了監聽的操做needAlarm賦值爲false,說明是用戶自身的操做,不是界面劫持。算法
手勢密碼複雜度
– 描述:測試客戶端手勢密碼複雜度,觀察是否有點位數量判斷邏輯
– 檢測:這個應該沒有明確的,就是自身感覺吧
– 建議:本身定標準吧數據庫
手勢密碼修改和取消
– 描述:檢測客戶端在取消手勢密碼時是否會驗證以前設置的手勢密碼,檢測是否存在其餘致使手勢密碼取消的邏輯問題
– 檢測:檢測客戶端在取消手勢密碼時是否會驗證以前設置的手勢密碼,檢測是否存在其餘致使手勢密碼取消的邏輯問題
– 建議:不該該存在其餘致使手勢密碼取消的邏輯,客戶端在取消手勢密碼時應驗證以前設置的手勢密碼數組
手勢密碼本地信息保存
– 描述:檢測在輸入手勢密碼之後客戶端是否會在本地記錄一些相關信息,例如明文或加密過的手勢密碼。
– 檢測:找到存儲文件,看其是否加密
– 建議:應該進行加密瀏覽器
手勢密碼鎖定策略
– 描述:測試客戶端是否存在手勢密碼屢次輸入錯誤被鎖定的安全策略。防止木馬使用窮舉法暴力破解用戶密碼。由於手勢密碼的存儲容量很是小,一共只有9!=362880種不一樣手勢,若手勢密碼不存在鎖定策略,木馬能夠輕易跑出手勢密碼結果。手勢密碼在輸入時一般以a[2][2]這種3*3的二維數組方式保存,在進行客戶端同服務器的數據交互時一般將此二維數組中數字轉化爲相似手機數字鍵盤的b[8]這種一維形式,以後進行一系列的處理進行發送。
手勢密碼抗攻擊測試
– 描述:驗證是否能夠經過插件繞過手勢密碼的驗證頁面
總體解決:手勢密碼的後面兩個檢測我也沒有遇到過。並且如今手勢密碼怎麼說,可能我接觸的不是不少吧。有興趣的朋友能夠找相關資料研究下
通訊加密
– 描述:驗證客戶端和服務器以前的通訊是否使用加密信道。
– 檢測:能夠利用抓包軟件進行查看
– 建議:使用https或者是http+403端口進行通訊。
關鍵數據加密和校驗
– 描述:測試客戶端程序提交數據給服務端時,密碼等關鍵字段是否進行了加密和校驗,防止惡意用戶嗅探和修改用戶數據包中的密碼等敏感信息。
– 檢測:抓包
– 建議:建議帳號,密碼,卡號,金額等進行加密處理,同時整個數據包進行二次加密,返回的敏感信息進行加密,同時返回數據包進行二次加密,而且使用增長隨機因子的校驗字段,而且肯定服務器邏輯標誌位正確,在刪除校驗字段時服務器不響應提交的數據包。
證書有效性驗證
– 描述:驗證客戶端和服務器之間是否存在雙向驗證的機制,同時確認此機制是否完善,服務器是否以白名單的方式對發包者的身份進行驗證
– 檢測:抓包
– 建議:建議客戶端和服務器進行雙向認證,而且服務器經過白名單的方式驗證客戶端證書以保證證書的有效性。
訪問控制
– 描述:測試客戶端訪問的URL是否僅能由手機客戶端訪問。是否能夠繞過登陸限制直接訪問登陸後才能訪問的頁面,對須要二次驗證的頁面(如私密問題驗證),可否繞過驗證。
– 檢測:利用截包工具獲取url,能用瀏覽器打開該url。
– 建議:建議服務器進行相應的訪問控制,控制對應頁面僅能經過手機客戶端訪問。同時進行頁面訪問控制,防止繞過登錄直接訪問頁面的非法訪問。
短信重放攻擊
– 描述:檢測應用中是否存在數據包重放攻擊的安全問題。是否會對客戶端用戶形成短信轟炸的困擾。
– 建議:抓包
– 建議:token和手機號一塊兒,重放沒法形成短信轟炸
這個須要根據業務進行檢測
BluetoothAdapter blueadapter = BluetoothAdapter
.getDefaultAdapter();
if ((blueadapter == null)
|| (blueadapter.getAddress() == null && blueadapter
.getName() == null)) {
MessageBox.promptDialog("請使用真實手機登錄",
LoginActivity.this);
}
固然else以後我是登陸操做,可是登陸前作了一些東西。這個就像消息推送同樣,手機的惟一標識cid之類的綁定。這裏只是給出個思路
這個我隨便截兩張圖給你們看一下,你們瞭解一下。一看大家就知道是什麼了
加密分爲對稱加密和非對稱加密
對稱加密
– 特色:高效,存在密鑰交換問題,安全度不如RSA,可是能勝任大部分加密
– 明文P 加密方法E 密文E(P) 解密方法D 加密密鑰K 解密密鑰K’
DK’(EK(P)) = P K = K’
EK(P):這是加密
對稱加密是基於乘積加密的(乘積加密是結合了置換算法和轉置算法,有興趣能夠了解一下)。而AES和DES都是基於乘積加密。AES加密比DES要高。可是如今也有3DES加密。
非對稱加密
– 特色:安全性高,沒有密鑰交換問題,效率低
– 明文P 加密方法E 密文E(P) 解密方法D 加密密鑰K 解密密鑰K’
DK’(EK(P)) = P K != K’(公鑰和私鑰不同,可是同時產生)
你們若是以爲還能看,頂下鼓勵一下,謝謝。有不妥之處也歡迎你們評論