目录
已经不做安卓开发有几年时间了,前两天之前写的一个webview的壳子被客户那边的安全扫描软件扫到几个漏洞。在网上查了一些解决方案,这些记录下来。
1、代码混淆
修改build.gradle文件中的minifyEnabled=true开启代码混淆,如下:
然后修改proguard-rules.pro这个文件,默认这个文件是空的。写入如下内容:
#1.基本指令区
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontpreverify
-verbose
-ignorewarning
-printmapping proguardMapping.txt
-optimizations !code/simplification/cast,!field/*,!class/merging/*
-keepattributes *Annotation*,InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
#2.默认保留区
-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.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class * extends android.view.View
-keep public class com.android.vending.licensing.ILicensingService
-keep class android.support.** {*;}
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclassmembers class * extends android.app.Activity{
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep public class * extends android.view.View{
*** get*();
void set*(***);
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
-keep class **.R$* {
*;
}
-keepclassmembers class * {
void *(**On*Event);
}
#3.webview
-keepclassmembers class fqcn.of.javascript.interface.for.webview {
public *;
}
-keepclassmembers class * extends android.webkit.webViewClient {
public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
public boolean *(android.webkit.WebView, java.lang.String);
}
-keepclassmembers class * extends android.webkit.webViewClient {
public void *(android.webkit.webView, jav.lang.String);
}
#上面部分都是通用的,下面是自己的
#libary包下的js的接口方法不混淆
-keep class jingu.com.jingu.libary.** { *; }
#第三方引入的库不混淆,对于xutils来说,很多博客都是下面两句,但其实只需要最后一句即可,不然bulid的时候会失败,因为-libraryjars已经引入过,这里不需要再引入
#-libraryjars libs/xUtils-2.6.14.jar
-keep class com.lidroid.** { *; }
2、禁止反编译
这个网上有比较多的在线加固的平台,像梆梆、腾讯云移动应用加密等等,我这里使用腾讯云的加固,有界面化,很方便
2.1 在线加固
入口url:https://cloud.tencent.com/login,可以使用微信或者QQ直接登录,登录成功后,搜索移动应用安全,进入如下页面:
2.2 重新签名apk
加固后的apk文件需要重新进行签名操作,可以直接使用命令的方式进行签名。命令行方式对apk进行签名操作,命令如下:
jarsigner -verbose -keystore android.keystore -signedjar app-r3-sgin.apk app-r3.apk android.keystore
app-r3-sgin.apk 是签名后文件名,app-r3.apk是待签名的文件,android.keystore是签名文件。
将签名文件和apk包放到同一个目录,然后cmd命令行切到这个目录,直接执行上面的命令。 正常情况下,会让输入密码。然后就开始签名了。 偶尔会出现如下异常提示,一般不用管。
2.3 梆梆加固
有些安全扫描工具对于腾讯云的安全加固扫描不出来,所以还是会提示没有进行加固,可以尝试使用梆梆加固。
注册账号,登陆成功之后,添加应用,然后在线加固即可,加固完成之后,下载应用,按照章节2.2重新进行apk的签名操作。最方便的是下载梆梆助手,通过这个工具直接进行加密,并导出重新签名的应用,然后去发布即可。 梆梆助手的下载地址为:https://dev.bangcle.com/home/download
3、禁用数据备份
Android 2.1以上的系统可为App提供应用程序数据的备份和恢复功能,该由AndroidMainfest.xml文件中的allowBackup属性值控制,其默认值为true。利用此类信息攻击者可伪造用户身份,盗取用户账户资产,或者直接对服务器发起攻击。当该属性没有显式设置为false时,攻击者可通过adb backup和adb restore对App的应用数据进行备份和恢复,从而可能获取明文存储的用户敏感信息,如用户的密码、证件号、手机号、交易密码、身份令牌、服务器通信记录等。
将allowBackup的属性显式设置为false,以关闭应用数据备份功能;或者使用具有本地数据加密功能的第三方专业加固方案,避免本地数据泄露。修改 AndroidManifest.xml文件,如下:
添加红框标注的两行。