日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android apk 安全措施详细说明(签名、混淆、加固、H5安全方案)

發(fā)布時間:2024/3/12 Android 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android apk 安全措施详细说明(签名、混淆、加固、H5安全方案) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章簡介:當一個Android app 開發(fā)完成后,我們總是希望對app進行一些安全措施,防止自己開發(fā)的apk被別人二次打包和簽名上傳到應用市場,同時防止apk被別人拿到之后進行反編譯進行二次開發(fā)。那么我們應該都做哪些防護措施呢?下面來一一說明。


1、apk簽名

打正式包之前,需要對apk進行簽名,如果您是用Android Studio開發(fā)工具,那么打包、簽名就非常簡單了。具體怎么簽名,網(wǎng)上文章很多,這里不做詳細描述。那么我們重點說說為什么要對apk進行簽名呢?

(1)apk簽名是應用程序作者對apk進行一個自定義的簽名,和權威機構的數(shù)字證書不同,它是開發(fā)者可自由定義的、作為此apk的唯一標識符,標識了apk的來源,任何第三方進行此apk二次打包時,如果簽名不一致則無法進行二次打包,并不能成功安裝到手機上。

(2)當新版程序和舊版程序的數(shù)字證書相同時,Android系統(tǒng)才會認為這兩個程序是同一個程序的不同版本。如果新版程序和舊版程序的數(shù)字證書不相同,則Android系統(tǒng)認為他們是不同的程序,并產(chǎn)生沖突,會要求新程序更改包名。

(3)Android系統(tǒng)允許擁有同一個數(shù)字簽名的程序運行在一個進程中,Android程序會將他們視為同一個程序。所以開發(fā)者可以將自己的程序分模塊開發(fā),而用戶只需要在需要的時候下載適當?shù)哪K。有利于程序的模塊化設計和開發(fā)。

(4)可以通過權限(permission)的方式在多個程序間共享數(shù)據(jù)和代碼。Android提供了基于數(shù)字證書的權限賦予機制,應用程序可以和其他的程序共享概功能或者數(shù)據(jù)給那那些與自己擁有相同數(shù)字證書的程序。如果某個權限(permission)的protectionLevel是signature,則這個權限就只能授予那些跟該權限所在的包擁有同一個數(shù)字證書的程序。


2、代碼混淆

代碼混淆的目的就是為了防止代碼的二次反編譯。Android apk通過反編譯工具可將classes.dex 字節(jié)碼轉換為java源代碼。為了防止看到最初的代碼,通過一定的方式將代碼進行混淆,混淆之后再反編譯后代碼就變的不可讀了。此外還優(yōu)化、壓縮了一些無用代碼、刪掉日志輸出等。目前隨著混合開發(fā)框架的興起,許多原生代碼混淆都變得沒有意義,但是,開發(fā)者或多或少的也會寫一些核心的原生代碼作為業(yè)務支撐,當然混淆還是必不可少的,下面就列出常用的混淆方式。
apk如何進行反編譯詳細步驟

2.1 混淆工具

proguard官網(wǎng)
官網(wǎng)介紹了proguar在Android項目中使用配置,下面來進行詳細說明

在build.gradle中 按照如下方式進行配置 屬性

/*** android 混淆*/buildTypes {release {// 不顯示LogbuildConfigField "boolean", "LOG_DEBUG", "false"//混淆minifyEnabled true// 移除無用的resource文件shrinkResources trueuseProguard trueproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//signingConfig signingConfigs.release}}

當我們開啟混淆后 (minifyEnabled 為 true 時)默認使用的混淆文件是proguard-android.txt。這個文件所在的位置為 /sdk/tools/ 下。一般來說使用默認的混淆文件即可進行混淆,但是混淆之后打包出來的apk并不不能運行,因為,有些需要保留的類沒有進行保留,這就需要你來自定義設置了,這時就需要掌握proguard規(guī)則。如果需要自定義設置規(guī)則,則需要在app目錄下創(chuàng)建文件proguard-rules.pro,在這個文件中進行規(guī)則設置,下面來貼一下我混淆使用的模版(適用于混合開發(fā)框架corodva及原生框架)
這里不做過多解釋,因為在模版的注釋中已經(jīng)詳細說明。

#添加依賴 #-libraryjars libs/AMap3DMap_7.9.1_AMapSearch_7.9.0_AMapLocation_5.3.1_20210414.jar# 不使用大小寫混合類名,混淆后的類名為小寫 -dontusemixedcaseclassnames # 混淆第三方庫 -dontskipnonpubliclibraryclasses # 混淆時記錄日志,有助于排查錯誤 -verbose # 代碼混淆使用的算法. -optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/* # 跳過預檢驗 -dontpreverify# 代碼混淆壓縮比,值在0-7之間,默認為5. -optimizationpasses 5# 優(yōu)化時允許訪問并修改有修飾符的類和類的成員 -allowaccessmodification# 保護代碼中的Annotation不被混淆 -keepattributes *Annotation*# 避免混淆泛型, 這在JSON實體映射時非常重要 # -keepattributes Signature # 拋出異常時保留代碼行號 -keepattributes SourceFile,LineNumberTable################################不需要混淆的######################## 這些類不混淆(混淆時默認保留,可不進行配置) -keep public class * extends android.app.Activity #-keep public class * extends android.app.Application #-keep public class * extends android.app.Service #-keep public class * extends android.content.BroadcastReceiver #-keep public class * extends android.content.ContentProvider #-keep public class * extends android.app.backup.BackupAgent #-keep public class * extends android.preference.Preference #-keep public class * extends android.support.v4.app.Fragment #-keep public class * extends android.support.v4.app.DialogFragment ##-keep public class * extends com.actionbarsherlock.app.SherlockListFragment ##-keep public class * extends com.actionbarsherlock.app.SherlockFragment ##-keep public class * extends com.actionbarsherlock.app.SherlockFragmentActivity #-keep public class * extends android.app.Fragment #-keep public class com.android.vending.licensing.ILicensingService# 不混淆,最后這兩個類我們基本也用不上,是接入Google原生的一些服務時使用的。 -keep public class com.google.vending.licensing.ILicensingService -keep public class com.android.vending.licensing.ILicensingService# Native方法不混淆 ni方法不可混淆,因為這個方法需要和native方法保持一致; -keepclasseswithmembernames class * {native <methods>; }# 枚舉類型不混淆 因為enum類的特殊性,以下兩個方法會被反射調用 -keepclassmembers enum * {public static **[] values();public static ** valueOf(java.lang.String); }# 保留Parcelable序列化類不被混淆 # Parcelable的子類和Creator靜態(tài)成員變量不混淆,否則會產(chǎn)生Android.os.BadParcelableException異常; -keep class * implements android.os.Parcelable {public static final android.os.Parcelable$Creator *; }-keepclassmembers class **.R$* {public static <fields>; }# We want to keep methods in Activity that could be used in the XML attribute onClick -keepclassmembers class * extends android.app.Activity {public void *(android.view.View); }# keep setters in Views so that animations can still work. # see http://proguard.sourceforge.net/manual/examples.html#beans -keepclassmembers public class * extends android.view.View {void set*(***);*** get*(); }# The support library contains references to newer platform versions. # Don't warn about those in case this app is linking against an older # platform version. We know about them, and they are safe. # 打包時忽略警告 -dontwarn android.support.**# Understand the @Keep support annotation. -keep class android.support.annotation.Keep-keep @android.support.annotation.Keep class * {*;}-keepclasseswithmembers class * {@android.support.annotation.Keep <methods>; }-keepclasseswithmembers class * {@android.support.annotation.Keep <fields>; }-keepclasseswithmembers class * {@android.support.annotation.Keep <init>(...); }# 保留第三方庫android.support.v4不被混淆 #-keep class android.support.v4.app.** { *; } #-keep interface android.support.v4.app.** { *; }#使用反射的類 -keep class android.app.AivityThread {*;} -keep interface android.content.pm.IPackageManager {*;} -keep class com.customer.plugins.appupdate.PackageManagerHook {*;}########################高德地圖混淆處理,不混淆高德地圖中已經(jīng)混淆的類############################## -dontwarn com.amap.api.** # -dontwarn com.a.a.** -dontwarn com.autonavi.**-keep class com.amap.api.** {*;} -keep class com.autonavi.** {*;} #-keep class com.a.a.** {*;}########################不混淆corodva相關,Cordova plugin 初始化時無法進行初始化############################# -keep class org.apache.cordova.** { *; } #-keep class cordova.** {*;} #-keep class com.customer.plugins.** {*;} -keep class * extends org.apache.cordova.CordovaPlugin

開啟了混淆打包過程中可能會出現(xiàn)一些報錯日志以及由于混淆之后出現(xiàn)的打包錯誤日志,可在如下圖位置(Toggle view)查看

混淆出現(xiàn)的錯誤可參考 混淆常見錯誤解決方法


3、H5壓縮包設置密碼或從服務端拉取

如果您的應用時混合開發(fā)模式,那么就涉及到了H5代碼的安全管理了。我們打包的apk,通過解壓縮后就會在assets文件夾下看到我們開發(fā)的H5相關文件,如js、html、資源文件等。這些文件的核心業(yè)務代碼會直接暴露出來。這里我提供兩種安全思路:

(1)可將H5文件的www包進行壓縮,放到Android框架中,并對壓縮包設置密碼,此時,如果設置了密碼那么就會多做一些額外的工作;應用啟動時和 apk版本升級時 都會涉及帶密碼的壓縮包的解壓。

(2)將H5相關文件存放到服務端,每次應用加載時都服務端拉取,并緩存到本地沙箱中,這樣打包出來的apk就不會出現(xiàn)H5源碼文件了。這樣做的缺點在于每次在進行版本升級時需要在前端進行版本比較。

(3)當然一些加固收費的工具可以對H5進行加固,加固的目標:H5加固服務,通過將JavaScript代碼進行混淆加密、壓縮等手段達到對HTML5應用的反調試、反竊取、反篡改等保護行為,保護H5應用的安全。一般來說都需要收費


4、應用加固

應用加固的目的,下面摘取360基礎加固服務(不收費)的圖:

具體加固方式可到官網(wǎng)獲取,步驟非常詳細。應用加固的方式也有很多種,可根據(jù)需要自行選擇。


5、總結

上述幾步并不是并行的,一個apk的安全措施上述幾步是必須要做的。下面來截幾張混淆后和加固后的 反編譯之后的java源碼的對比圖:附上
apk如何進行反編譯詳細步驟

(1)混淆后加固前的 字節(jié)碼反編譯為java源碼的截圖如下所示

(2)先混淆后并加固后 字節(jié)碼反編譯為java源碼的截圖如下所示

對比兩圖之后可發(fā)現(xiàn),加固后的代碼暴露的越來越少了。感興趣的同學可以研究一下。


歡迎大家查看,有問題可留言,隨時回復。

總結

以上是生活随笔為你收集整理的Android apk 安全措施详细说明(签名、混淆、加固、H5安全方案)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。