標籤:Android 使用者體驗 移動開發 休閑 安全性原創作品,允許轉載,轉載時請務必以超連結形式標明文章 原始出處 、作者資訊和本聲明。否則將追究法律責任。http://yuchen.blog.51cto.com/2739238/586940
Android免費培訓QQ群(118949422)第二期專題培訓
(轉載請註明出處,商用請與本人聯絡)
1. 首先我們思考一個問題,Android中哪些部分需要提高安全性防止被破解,哪些部分無法保證安全?
a) 首先,如果你的應用跟其他人競爭的是創意、使用者體驗、服務等等偏軟的東西,同時是免費的,並沒有什麼技術痛點,要評估一下是否確實需要提高代碼的安全性。
b) 對於圖片、xml檔案或者apk檔案本身是無法加密的。因為這些檔案是由Andriod虛擬機器載入和讀取,加密後Android虛擬機器無法識別,你的應用也無法正常使用了。如果有需要保密的內容,不要放到這些檔案裡。
c) 有很多Android應用需要與服務端做資料通訊,如果傳輸的資料做了加密,那麼用戶端加密或解密可能會使用到密鑰,這個密鑰最好是動態。
d) 關鍵的商務邏輯、演算法和涉及到金融交易的部分,需要極高的安全性,必須多種加密方法並用。
2. 防止代碼被反編譯的幾種方法:
a) 盡量減少用戶端代碼中的敏感內容,例如密碼編譯演算法的key
要想完全不被破解是不可能的,微軟蘋果這樣的公司,一樣會被破解越獄。我們只能想辦法提高被反編譯的難度,提高被破解的門檻。
首先讓敏感的內容盡量在服務端,而不是放到用戶端,密鑰用動態。不要自己給自己埋下禍根,盡量不要留下會被破解的可能性。墨菲定律說,一件壞事如果可能發生,那麼它一定會發生。
b) 自訂類載入器(Custom ClassLoader)
通過自訂類載入器,可以載入加密過的.class檔案,在載入時使用自訂的類載入器解密的方式提高代碼的安全性。
這種方式在有機會使用自己的類載入器的情境下可以使用,例如C/S架構的程式,用戶端是Java編寫的(Swing或SWT),這種程式在大公司和國外較常見,國內小公司很少會用Java來寫用戶端。
對於Android程式,對於繼承Android的Activity、Service等基類的子類,無法使用類載入器,如果要使用,那麼需要把關鍵的代碼抽離出來,獨立成一個與Android架構無關的類,這樣可以使用自訂的類載入器來載入。
但這裡仍然有隱患,因為這個自訂的類載入器也是java編寫的,也會被反編譯。只不過這樣處理後又增加了一道屏障,提高了被破解的難度。
c) 使用JNI
用C或C++編寫的代碼相對於Java來說更難被反編譯。但這種方法除非真的有必要,否則不提倡使用。
因為本地代碼很難調試,如果執行異常會導致整個虛擬機器異常關閉。同時.so會被載入到虛擬機器的記憶體中,無論是否使用都佔用記憶體空間。
另外,很多搞Java的人不太熟悉C或C++、如果你的公司有人熟悉還好。
d) 混淆
混淆是在不改變代碼邏輯的情況下,增加無用代碼,或者重新命名類名、方法名和變數名,使反編譯後的原始碼難於看懂,提高被破解的難度。
本專題重點講解在Android應用程式如何混淆代碼,首先我們先來看一下混淆前後反編譯的結果對比。
圖1 原始代碼
圖2 混淆前反編譯
圖3 混淆後反編譯
我們可以看到,類名、方法名和變數名等都會被改掉,方法的含義無法直接看出來,但如果是字串常量還是會被反編譯出來的,所以說關鍵的key不能放到apk中,它無處遁形。
下面我們來介紹如何使用混淆工具。Android2.3中提供了混淆的功能,跟我們這裡介紹的使用的都是proguard混淆器。
我們介紹的這一個方法,除了混淆之外,還包括程式的簽名,安裝等功能。它是基於ant編譯的,功能更強大。你也可以在整個編譯過程插入其他你想要的功能,例如單元測試。
使用方法:
首先要在你的工程中增加一個設定檔,用來配置環境變數和簽名檔案,例如build.cfg,在這個檔案中需要指定哪些類不需要被混淆。在Android中,所有在設定檔中會使用到類名的類,不應該被混淆。否則程式執行過程中會出現ClassNotFoundException。
再建立一個build.xml,用於指定ant編譯的過程。最後執行build.xml,就完成了代碼的混淆、打包、簽名整個過程。你可以用反編譯工具檢測一下是否混淆成功。
圖4 執行build.xml的方法
請參考工程樣本來操作,設定檔中需要修改的地方都已標出,請搜尋“這裡要修改”關鍵字,所有尋找到的地方都要檢查一下,按照自己的環境配置修改。
以上幾種方法結合使用,效果倍增。破解你程式的人會說,想不到獅吼功還有一招大喇叭……
如果你的公司真的需要這麼保密,那麼,首先要看你的公司是否有嚴密成熟的資訊安全制度,否則一切都徒勞,因為家賊難防,堡壘最容易從內部攻破。
原始碼已共用,地址:http://u.115.com/file/bhnchwu6
答疑在QQ群中。
附:混淆使用的是免費的proguard組件,官網:http://proguard.sourceforge.net/
隋雨辰
本文出自 “雨辰專欄” 部落格,請務必保留此出處http://yuchen.blog.51cto.com/2739238/586940