Android升级apk签名文件校验

升级apk流程:从服务器下载更新的apk----对apk做校验----安装apk

本文讲一下对apk做签名文件校验,实际上就是获取本机已安装apk的签名和从服务器下载的apk的签名,计算两个签名文件的MD5,如果MD5一样,就说明签名文件正确。

boolean sigMd5 = veritySignature(getUpdateApkName(), downloadpath + filename);
private boolean veritySignature(String pkgName, String filePath) {
        try {
            LogUtils.d("pkgName:" + pkgName + " filaPath:" + filePath);
            //获取已安装应用签名
            Signature pkgSig = getPackageManager()
                    .getPackageInfo(pkgName, PackageManager.GET_SIGNATURES)
                    .signatures[0];

            //获取下载的apk签名
            Signature apkSig = Objects.requireNonNull(getPackageManager()
                    .getPackageArchiveInfo(filePath, PackageManager.GET_SIGNATURES))
                    .signatures[0];

            //对比两个签名的md5是否一致
            String pkgSigMd5 = getMd5(pkgSig);
            String apkSigMd5 = getMd5(apkSig);
            LogUtils.d("pkgSigCode:" + pkgSigMd5 + " apkSigCode:" + apkSigMd5);
            if (pkgSigMd5.equals(apkSigMd5)) {
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    private String getMd5(Signature signature) {
        return encryptionMD5(signature.toByteArray());
    }

    public static String encryptionMD5(byte[] byteStr) {
        MessageDigest messageDigest = null;
        StringBuffer md5StrBuff = new StringBuffer();
        try {
            messageDigest = MessageDigest.getInstance("MD5");
            messageDigest.reset();
            messageDigest.update(byteStr);
            byte[] byteArray = messageDigest.digest();
            for (int i = 0; i < byteArray.length; i++) {
                if (Integer.toHexString(0xFF & byteArray[i]).length() == 1) {
                    md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));
                } else {
                    md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
                }
            }
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return md5StrBuff.toString();
    }

用cmd验证:
1、解压apk文件
2、获取RSA文件的fingerprints

keytool -printcert -file G:\test\testapk\META-INF\CERT.RSA

会得到签名文件的MD5、SHA1。比较两个文件的MD5或SHA1,如果一样就是相同的签名

你可能感兴趣的:(Android)