Android开发签名校验
有一些平台需要我们做签名校验才能通过审核,其实做Android签名校验也不是很难
直接上代码:
class SignCheck {/*** 获取应用的签名*/private fun getCer(mContext: Context): String? {var packageInfo: PackageInfo? = nulltry {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? = nulltry {cf = CertificateFactory.getInstance("X509")} catch (e: Exception) {e.printStackTrace()}var c: X509Certificate? = nulltry {c = cf!!.generateCertificate(input) as X509Certificate} catch (e: Exception) {e.printStackTrace()}var hexString: String? = nulltry {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.lengthif (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>() {@Overridepublic 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() {@Overridepublic 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开发或者鸿蒙开发需求或者问题的可以私信我,我每天都看私信的