Roin
Roin
  • 发布:2019-08-26 16:59
  • 更新:2021-01-04 18:28
  • 阅读:12044

安卓环境下应用签名校验,解决【应用签名未校验风险】

分类:Native.js

由于业务需要,公司对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 关注 分享
首席劝退师 郑先生 1***@qq.com

要回复文章请先登录注册

937bb

937bb

你好,使用你的代码获取到的sha1与安装包的不一致
2021-01-04 18:28
1***@qq.com

1***@qq.com

牛批,我们也安全评估,正在做这些东西,感谢分享。
2020-06-29 15:02
郑先生

郑先生

正好需要,感谢分享
2019-10-04 12:16