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