Android开发签名校验

Android开发签名校验

有一些平台需要我们做签名校验才能通过审核,其实做Android签名校验也不是很难

直接上代码:

class SignCheck {
    /**
     * 获取应用的签名
     */
    private fun getCer(mContext: Context): String? {
        var packageInfo: PackageInfo? = null
        try {
            packageInfo = mContext.packageManager.getPackageInfo(
                mContext.packageName, PackageManager.GET_SIGNATURES
            )
        } catch (e: PackageManager.NameNotFoundException) {
            e.printStackTrace()
        }
        val cert = packageInfo?.signatures?.get(0)?.toByteArray()
        val input: InputStream = ByteArrayInputStream(cert)
        var cf: CertificateFactory? = null
        try {
            cf = CertificateFactory.getInstance("X509")
        } catch (e: Exception) {
            e.printStackTrace()
        }
        var c: X509Certificate? = null
        try {
            c = cf!!.generateCertificate(input) as X509Certificate
        } catch (e: Exception) {
            e.printStackTrace()
        }
        var hexString: String? = null
        try {
            val md = MessageDigest.getInstance("SHA1")
            val publicKey = md.digest(c!!.encoded)
            hexString = byte2HexFormatted(publicKey)
        } catch (e1: NoSuchAlgorithmException) {
            e1.printStackTrace()
        } catch (e: CertificateEncodingException) {
            e.printStackTrace()
        }
        return hexString
    }

    //这里是将获取到得编码进行16 进制转换
    private fun byte2HexFormatted(arr: ByteArray): String {
        val str = StringBuilder(arr.size * 2)
        for (i in arr.indices) {
            var h = Integer.toHexString(arr[i].toInt())
            val l = h.length
            if (l == 1) h = "0$h"
            if (l > 2) h = h.substring(l - 2, l)
            str.append(h.uppercase(Locale.getDefault()))
            if (i < arr.size - 1) str.append(':')
        }
        return str.toString()
    }

    /**
     * 检测签名是否正确
     */
    fun checkSign(mContext: Context, callback:() -> Unit){
        getCer(mContext)?.let { cer ->
            if(cer.trim { it <= ' ' } == getRealCer(mContext).trim { it <= ' ' }){
                callback()
            }else{
                AlertDialog.Builder(mContext)
                    .setTitle("签名校验失败")
                    .setMessage("存在签名异常,请在官方下载最新的APP")
                    .setCancelable(false)
                    .setPositiveButton("确定") { _, _ -> exitProcess(0) }
                    .show()
            }
        } ?: callback()
    }

    /**
     * @desc : 比对的是sha1
     * 
     **/
    private fun getRealCer(mContext: Context) : String{
        return when(mContext.packageName){
            "com.xx.com" -> "15:xx:xx:xx:BA"
           
            else -> "6D:xx:xx:xx:B8"
        }
    }
}

使用:

new SignCheck().checkSign(mContext, new Function0<Unit>() {
            @Override
            public Unit invoke() {
                if(!SPNoCleanUtil.getIsAgreeYSAndXY()){
                    SPNoCleanUtil.saveIsAgreeYSAndXY();
                    ((MyApplication)getIView().getContext().getApplicationContext()).initSDK();
                }
                if(SPNoCleanUtil.getIsAgreeYSAndXY() && ModifySetUtils.IS_HUAWEI_PAY){
                    // 初始化华为联运相关
                    JosApps.getJosAppsClient(StartupActivity.this).init();
                }
                //获取全局系统参数
                getPresenter().getGlobalSysParams(new StartupPresenter.GlobalSysParamsFinishListener() {
                    @Override
                    public void onFinish() {
                        GlobalSysParamResult.DataBean globalBean = SPNoCleanUtil.getObject(SPKey.SYSPARAM_GLOBAL);
                        if(null != globalBean && !TextUtils.isEmpty(globalBean.getCoopenAdid())){
                            IntentUtils.startAdActivity(mContext,AdStartupActivity.START_UP_TYPE,globalBean.getCoopenAdid(),1 );
                        } else {
                            if (ModifySetUtils.IS_NEED_GUIDE_IMAGE && !SPNoCleanUtil.getBoolean(SPKey.GUIDE, false)) {
                                IntentUtils.startIntroductionActivity(mContext);
                            } else if (!SPUtils.getIsLogin()) {
                                IntentUtils.startGuideActivity(mContext);
                            } else {
                                IntentUtils.startStartToMainActivity(mContext);
                            }
                        }
                        finish();
                    }
                });


                return null;
            }
        });

有Android开发或者鸿蒙开发需求或者问题的可以私信我,我每天都看私信的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

893151960

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

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

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

打赏作者

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

抵扣说明:

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

余额充值