Android 安全与防护策略
背景:
隨著應(yīng)用的發(fā)展,應(yīng)用的安全也變的越來(lái)越重要,有些不法分子開始反編譯或者劫持一些app源碼。甚至有人通過截圖然后做識(shí)別,獲取別人內(nèi)容。我們?cè)谔幚頃r(shí)應(yīng)該如何去保護(hù)我們的應(yīng)用呢?接下來(lái)我們可以分析一下,一些場(chǎng)景,的用途
1.防止截屏:
在系統(tǒng)中,已提供防止截屏的標(biāo)識(shí),我們只需要加進(jìn)去即可
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
?這個(gè)只能防止一個(gè)頁(yè)面被截屏,如果需要所有頁(yè)面,可以放在基類(父類)中,子類可以通過參數(shù)來(lái)配置
通過IDE的截屏也會(huì)報(bào)錯(cuò)。
錄屏也是黑屏。?
2.數(shù)據(jù)加密
2.1SharedPreferences
SharedPreferences這個(gè)類,在Android中用的比較多,是用來(lái)存儲(chǔ)臨時(shí)數(shù)據(jù)的,但是這個(gè)類存儲(chǔ)的數(shù)據(jù)以xml文件落在文件夾里。所有,只要root設(shè)備后,找到該文件夾下的文件,就可以以明文的方式展示。有些開發(fā)者也把登錄密碼或者token值直接存儲(chǔ),這樣就會(huì)導(dǎo)致這些數(shù)據(jù)有可能會(huì)被盜取。所以在SharedPreferences存儲(chǔ)一些重要數(shù)據(jù)可以進(jìn)行加密。
2.2加密算法
加密分為對(duì)稱加密和非對(duì)稱加密。
對(duì)稱加密:所謂對(duì)稱,就是采用這種加密方法的雙方,使用方式用同樣的密鑰進(jìn)行加密和解密。密鑰是控制加密及解密過程的指令。算法是一組規(guī)則,規(guī)定如何進(jìn)行加密和解密。
非對(duì)稱加密:非對(duì)稱加密算法需要兩個(gè)密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。公開密鑰與私有密鑰是一對(duì),如果用公開密鑰對(duì)數(shù)據(jù)進(jìn)行加密,只有用對(duì)應(yīng)的私有密鑰才能解密;如果用私有密鑰對(duì)數(shù)據(jù)進(jìn)行加密,那么只有用對(duì)應(yīng)的公開密鑰才能解密。因?yàn)榧用芎徒饷苁褂玫氖莾蓚€(gè)不同的密鑰,所以這種算法叫作非對(duì)稱加密算法
3.網(wǎng)絡(luò)請(qǐng)求的證書
在APP中,應(yīng)用和服務(wù)器請(qǐng)求需要網(wǎng)絡(luò),常見的是http或者h(yuǎn)ttps。裸奔的網(wǎng)絡(luò)一般會(huì)被抓包工具抓去,這樣,我們的數(shù)據(jù)就會(huì)被被人劫持或者修改。
證書的綁定可以很好的解決這個(gè)問題,通過證書驗(yàn)證,來(lái)拒絕非法攔截等
在啟用https和證書時(shí),我們可以通過https的證書來(lái)進(jìn)行證書校驗(yàn),如果證書驗(yàn)證不過,會(huì)直接拒絕,目前證書在app的網(wǎng)絡(luò)中被廣泛投入使用。關(guān)于證書的綁定可以參考不同的網(wǎng)絡(luò)框架。
4.簽名驗(yàn)證
每個(gè)應(yīng)用都有自己的獨(dú)立簽名,我們可以獲取app當(dāng)前的簽名MD5或者SHA1值,和原簽名的進(jìn)行校驗(yàn),如果對(duì)不上,基本判斷是非法簽名。原簽名信息如果泄露應(yīng)及時(shí)更換簽名文件,否則可能導(dǎo)致簽名信息被惡意盜用。
public String getSingleAlgorithm(Context context) {try {PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES);byte[] cert = info.signatures[0].toByteArray();MessageDigest md = MessageDigest.getInstance("SHA1");byte[] publicKey = md.digest(cert);StringBuilder builder = new StringBuilder();for (int i = 0; i < publicKey.length; i++) {String appendString = Integer.toHexString(0xFF & publicKey[i]).toUpperCase(Locale.US);if (appendString.length() == 1)builder.append("0");builder.append(appendString);builder.append(":");}return builder.toString();} catch (Exception e) {e.printStackTrace();}return null; }5.代碼的混淆
代碼混淆,是一種安全措施。在應(yīng)用中被廣泛使用。將代碼混淆后,提高了代碼的閱讀難度,即使apk被破解,混淆后的代碼閱讀難度更大。
如何混淆代碼?請(qǐng)看混淆詳解
混淆目前來(lái)說(shuō),對(duì)應(yīng)用算是比較小的投入。在混淆開啟,需要注意的是會(huì)產(chǎn)生一個(gè)mapping.txt文件,這個(gè)文件對(duì)應(yīng)的包,且該文件最好保存起來(lái),如果在后期出現(xiàn)崩潰或者異常,可以通過trace追蹤還原源代碼所在行。有助于bug修復(fù)和定位
6.加固
加固已成為防脫殼的一種常見的手段,目前市場(chǎng)上有好多種加固方案,我們自己可以選擇一種,但是在進(jìn)入應(yīng)用市場(chǎng),第三方也會(huì)對(duì)我們的應(yīng)用進(jìn)行加固。加固的目的就是提高apk的安全性,提高被破解的難度
7.dex加密
可以參考三方
8.android:exported="" 開閉
如果封閉起來(lái),對(duì)應(yīng)的組件只在內(nèi)部使用,無(wú)法和外部通訊,外部也無(wú)法去獲取你應(yīng)用的通信。
9.其他會(huì)不定期補(bǔ)充進(jìn)來(lái)
總結(jié)
以上是生活随笔為你收集整理的Android 安全与防护策略的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 排序算法:希尔排序
- 下一篇: Select之多表查询