Androidアップグレードapk署名ファイルチェック

12480 ワード

アップグレードapkプロセス:サーバから更新されたapkをダウンロードする---apkを検証する---apkをインストールする
本稿では,apkに対する署名ファイルの検証について述べるが,実際には,本機にインストールされたapkの署名とサーバからダウンロードされたapkの署名を取得し,2つの署名ファイルのMD 5を計算し,MD 5が同じであれば署名ファイルが正しいことを示す.
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

署名ファイルのMD 5、SHA 1が得られます.2つのファイルのMD 5またはSHA 1を比較し、同じ署名であれば