Android中的apk通过签名校验防止反编译重打包

Android开发完打包好的apk如果被别人盗取可能会存在被反编译重打包的风险,那么我们如何来保护我们辛苦开发出来的程序不被别人盗取重打包呢,这里我们通过签名文件入手,因为打包时候是需要签名的,别人盗取后如果重打包也是需要签名的,那么如果重打包的签名跟我们原本打包的签名不一样,就可以阻止他使用该apk。

我们要在首页MainActivity里来判断重打包的签名文件是否与原签名文件一致:

/**
     * 获取签名文件的第一个签名值
     * @param packageName  应用包名
     * @return
     */
    public int getSignature(String packageName){
        PackageManager packageManager = this.getPackageManager();
        PackageInfo packageInfo = null;
        int sign = 0;
        try {
            packageInfo = packageManager.getPackageInfo(packageName,PackageManager.GET_SIGNATURES);
            Signature[] signatures = packageInfo.signatures;
            sign = signatures[0].hashCode();
        } catch (PackageManager.NameNotFoundException e) {
            sign = 0;
            e.printStackTrace();
        }
        return sign;
    }

签名文件的获取是在app的build.gradle文件里配置的

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.0"

    //配置签名文件信息
    signingConfigs {
        release {
            keyAlias 'xxx.keystore'
            keyPassword '123'
            storeFile file('D:/xxx.jks')
            storePassword '123'
        }
    }
    ……
}
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //通过签名校验防止重打包
        Log.d("tag","getSignature:" + getSignature("com.wjy.project.mylearntest"));
        //987654321这里是随便写的,实际的值是上面log  getSignature("com.wjy.project.mylearntest")输出的值
        if (getSignature("com.wjy.project.mylearntest") != 987654321){
            Toast.makeText(this,"app被重新打包",Toast.LENGTH_SHORT).show();
            //这里可以写使应用程序退出或杀死应用程序的代码,这样可以保护我们的apk不被重新打包
        }
    }

这样,通过签名文件的校验,如果不匹配就可以退出应该程序来防止重打包了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时代新人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值