由于业务需要,公司对App进行了第三方安全评估,发现了【应用签名未校验风险】,而且风险等级为【高】,老板看了说一定要解决,“拿人钱财,替人消灾”,开干!。
以下代码已在安卓6.0和安卓9.0手机上测试通过。
//如果是安卓运行环境,校验应用签名是否正确
if(plus.os.name=='Android'){
if(!checkApkSign('SHA1')){
$.alert('签名异常,请到各大应用市场下载安装正版XXXX。','错误',function (e) {
plus.runtime.quit();
});
}
}
/**
* 检查安卓APK签名
* @param {String} type 签名指纹类型:MD5或SHA1
*/
function checkApkSign(type){
//获取应用上下文
var context = plus.android.runtimeMainActivity();
var PackageManager = plus.android.importClass("android.content.pm.PackageManager");
var packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(),PackageManager.GET_SIGNING_CERTIFICATES||PackageManager.GET_SIGNATURES)
var Build = plus.android.importClass("android.os.Build");
var signatures = null;
//Android 28以后获取包签名信息方法改了
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.P){
var signingInfo = packageInfo.plusGetAttribute('signingInfo');
signatures = plus.android.invoke(signingInfo,"getApkContentsSigners")
}else{
signatures = packageInfo.plusGetAttribute('signatures');
}
if (signatures != null) {
var signature;
var byteArr;
var currentSignature;
var md = plus.android.invoke("java.security.MessageDigest","getInstance",type);
for (var i in signatures) {
byteArr=plus.android.invoke(signatures[i],"toByteArray");
plus.android.invoke(md,"update",byteArr);
currentSignature = Bytes2HexString(plus.android.invoke(md,"digest")).toUpperCase();
//根据检验类型,与与你签名文件对应的签名值比对
if(("SHA1"==type && "你签名的SHA1值"==currentSignature)
|| ("MD5"==type &&"你签名的MD5值"==currentSignature)){
return true;
}
}
} else {
console.info("应用未签名");
}
return false;
}
//字节数组转十六进制字符串,对负值填坑
function Bytes2HexString(arrBytes) {
var str = "";
for (var i = 0; i < arrBytes.length; i++) {
var tmp;
var num=arrBytes[i];
if (num < 0) {
//此处填坑,当byte因为符合位导致数值为负时候,需要对数据进行处理
tmp =(255+num+1).toString(16);
} else {
tmp = num.toString(16);
}
if (tmp.length == 1) {
tmp = "0" + tmp;
}
str += tmp;
}
return str;
}
3 个评论
要回复文章请先登录或注册
937bb
1***@qq.com
郑先生