淺談Android安全風(fēng)險與防范措施
做好的apk文件,被檢測工具檢測出一大堆風(fēng)險問題,是不是感覺自己的付出白費(fèi)了,今天咱就聊聊android的安全防范問題。
一,先說安全檢查方面的吧
1,源文件安全問題方面
1.1篡改和二次打包風(fēng)險
1.2應(yīng)用簽名未校驗風(fēng)險
1.3Java代碼反編譯風(fēng)險檢測
1.4代碼未混淆風(fēng)險檢測
1.5資源文件泄露風(fēng)險檢測
2,數(shù)據(jù)存儲安全問題方面
2.1 WebView明文存儲密碼風(fēng)險檢測
2.2Internal Storage數(shù)據(jù)全局可讀寫風(fēng)險檢測
3.3加密算法不安全使用風(fēng)險
4.4日志數(shù)據(jù)泄露風(fēng)險
4.5URL硬編碼風(fēng)險
3,組件風(fēng)險
3.1Activity組件導(dǎo)出風(fēng)險
3.2Service組件導(dǎo)出風(fēng)險
3.3Content Provider組件導(dǎo)出風(fēng)險
3.4Broadcast Receiver組件導(dǎo)出風(fēng)險
3.5WebView遠(yuǎn)程代碼執(zhí)行漏洞
3.6Intent Scheme URL攻擊風(fēng)險
4,安全防護(hù)能力
4.1Java層代碼動態(tài)調(diào)試風(fēng)險
4.2C層代碼動態(tài)調(diào)試風(fēng)險
4.3動態(tài)注入攻擊風(fēng)險
4.4模擬器運(yùn)行風(fēng)險
4.5啟動隱藏服務(wù)風(fēng)險
4.6Root設(shè)備運(yùn)行風(fēng)險
5,內(nèi)容風(fēng)險
5.1自定義詞匯
5.2敏感文本
5.3敏感圖片
這種類型的風(fēng)險存在于發(fā)布文章類或信息類應(yīng)用,“涉黃”,“賭博”等詞匯與圖片需要進(jìn)行敏感內(nèi)容識別或過濾。為了節(jié)約成本,可以人工審核信息來完成,當(dāng)然,這樣工作量太大,要是有Money的話可以介入專業(yè)的
檢測公司API,來讓應(yīng)用的內(nèi)容安全做的更嚴(yán)密些。
二,在自己沒錢的情況下,看我們能做哪些事吧
1,打包應(yīng)用,基本要加的就是混淆了,當(dāng)然,我們還要再創(chuàng)建一個簽名文件
2,要是我們應(yīng)用體積大了,還可以再壓縮一下資源文件,我用 的是 AndResGuard
3,沒錢,沒辦法啊,那就來個免費(fèi)的加固服務(wù)吧。
做到這些,是不是大家都覺得,我也是這樣做的。是的,一般我們程序都會做這些基本的操作,但是我們還可以再做些什么?
情況1,應(yīng)用被反編譯后二次打包了----apk在正式打包后生成hash簽名保存在服務(wù)端。應(yīng)用每次啟動后校驗當(dāng)前應(yīng)用hash與服務(wù)端保存的是不是一致,以此來校驗應(yīng)用是不是合法的。嘿嘿,是不是解決問題的一種方法了
上代碼:
/**
* 根據(jù)apk MD5摘要獲取對應(yīng)的哈希值
*
* @param context
* @return
*/
public static String getApkHashValue(Context context) {
String apkPath = context.getPackageCodePath(); // 獲取Apk包存儲路徑
try {
MessageDigest dexDigest = MessageDigest.getInstance("MD5");
byte[] bytes = new byte[1024];
int byteCount;
FileInputStream fis = new FileInputStream(new File(apkPath)); // 讀取apk文件
while ((byteCount = fis.read(bytes)) != -1) {
dexDigest.update(bytes, 0, byteCount);
}
/* BigInteger bigInteger = new BigInteger(1, dexDigest.digest()); // 計算apk文件的哈希值
String sha = bigInteger.toString(16);*/
//解決MD5在特殊情況下丟失0的情況
StringBuffer buf = new StringBuffer();
byte[] b = dexDigest.digest();
int i;
for (int offset = 0; offset < b.length; offset++) {
i = b[offset];
if (i < 0) {
i += 256;
}
if (i < 16) {
buf.append("0");
}
buf.append(Integer.toHexString(i));
}
fis.close();
return buf.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return "";
} catch (FileNotFoundException e) {
e.printStackTrace();
return "";
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
情況2;很多時候apk被反編譯或被破壞,多通過模擬器或者獲取root權(quán)限來操作
沒辦法,只能給模擬器說再見了。正式發(fā)布程序后,代碼檢測運(yùn)行設(shè)備是否是模擬器,如果是的話,就不讓運(yùn)行了,root 設(shè)備一樣的驗證邏輯,簡單粗暴!!!
但是root或模擬器檢測并沒有官方的或權(quán)威的檢測代碼,誰讓android品牌太多太雜了捏,沒辦法。真遇到這種兼容性問題的話,沒事,我們可以再做檢查邏輯時,留一手服務(wù)端驗證,
由服務(wù)端來控制這個版本或者某個用戶走不走這部分驗證邏輯額~~~~~,后邊的可以自行發(fā)揮解決。
情況3,動態(tài)調(diào)試,內(nèi)存讀取......
和情況2思路一致,均是通過代碼來檢測是否有調(diào)試等工具在調(diào)試程序,然后做出相應(yīng)的判斷處理
其他情況都比較常見了,隨便百度就能找到解決方法,這里就不啰嗦了。嘿嘿
最后,要是你們公司很有錢,那就不考慮那么多了,來個專業(yè)機(jī)構(gòu)加密,一下風(fēng)險就降到最低,只要有money~
沒有絕對的安全,我們能做的就是把安全風(fēng)險降到最低,歐力給!
以上就是淺談Android安全風(fēng)險與防范措施的詳細(xì)內(nèi)容,更多關(guān)于Android安全風(fēng)險與防范措施的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android?App應(yīng)用退到后臺顯示通知的實現(xiàn)方法
當(dāng)用戶收到app發(fā)過來的消息時,如果app沒有在前臺打開,需要提醒用戶有新的消息,所以這篇文章主要給大家介紹了關(guān)于Android?App應(yīng)用退到后臺顯示通知的實現(xiàn)方法,需要的朋友可以參考下2022-01-01
詳解Android應(yīng)用main函數(shù)的調(diào)用
Android常識,App主線程初始化了Looper,調(diào)用prepare的地方是ActivityThread.main函數(shù)。問題來了,App的main函數(shù)在哪兒調(diào)用,下面我們來一起學(xué)習(xí)一下吧2019-06-06
android采用FFmpeg實現(xiàn)音視頻合成與分離
這篇文章主要為大家詳細(xì)介紹了android采用FFmpeg實現(xiàn)音視頻合成與分離,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12
Android中ViewPager懶加載的優(yōu)化詳解
這篇文章主要為大家詳細(xì)介紹了Android中ViewPager懶加載的優(yōu)化相關(guān)技巧,文中的示例代碼講解詳細(xì),有需要的小伙伴可以跟隨小編一起了解下2024-04-04
Android序列化接口Parcelable與Serializable接口對比
我們使用 Intent 傳遞數(shù)據(jù)的時候,putExtra() 所支持的數(shù)據(jù)類型事有限的,當(dāng)需要傳遞自定義對象的時候就需要序列化。Serializable更簡單但是會把整個對象進(jìn)行序列化因此效率比Parcelable低一些2023-02-02

