当前位置: 首页 > article >正文

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开发或者鸿蒙开发需求或者问题的可以私信我,我每天都看私信的


http://www.kler.cn/a/536910.html

相关文章:

  • Redis --- 使用Feed流实现社交平台的新闻流
  • mysql的cpu使用率100%问题排查
  • vue项目如何设置默认页面
  • 劳务报酬所得税
  • java手动实现常见数据结构
  • Zenoh在工业物联网场景中的性能研究
  • 新能源产业的质量革命:六西格玛培训如何重塑制造竞争力
  • uniapp实现人脸识别(不使用三方插件)
  • ISP代理与住宅代理的区别
  • MySQL——数据库的操作
  • 【重新认识C语言----文件管理篇】
  • 【面试场景】MySQL分布式主键选取
  • C++,设计模式,【单例模式】
  • NetCore Consul动态伸缩+Ocelot 网关 缓存 自定义缓存 + 限流、熔断、超时 等服务治理 + ids4鉴权
  • 学习率调整策略 | PyTorch 深度学习实战
  • IntelliJ IDEA新版本的底部version control(或git)里local change窗口显示配置修改详细教程
  • PHP填表统计预约打卡表单系统小程序
  • 配置GitHub和PicGo的详细步骤
  • 通过Python编写的中国象棋小游戏
  • mac 安装 dotnet 环境
  • 嵌入式硬件篇---OpenMV串口通信json字符串
  • Redis | 十大数据类型
  • Spring Boot:解决现代Java应用开发的难题
  • 关于阿里云 dataworks 运维中心下的任务运维的问题
  • 发布:大彩科技DN系列2.8寸高性价比串口屏发布!
  • TPC服务器与客户端的搭建