import java.io.FileInputStream;
import java.io.IOException;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

public class ApkSignatureChecker {
    private static final String ANDROID_MANIFEST_FILE = "AndroidManifest.xml";
    private static final String V1_SIGNATURE_FILE = "META-INF/CERT.RSA";

    public static boolean hasV1Signature(String apkFilePath) {
        try {
            JarFile jarFile = new JarFile(apkFilePath);
            JarEntry manifestEntry = jarFile.getJarEntry(ANDROID_MANIFEST_FILE);
            JarEntry signatureEntry = jarFile.getJarEntry(V1_SIGNATURE_FILE);

            if (manifestEntry != null && signatureEntry != null) {
                List<X509Certificate> certificates = loadCertificates(jarFile, signatureEntry);
                if (certificates != null && !certificates.isEmpty()) {
                    return true;
                }
            }

            jarFile.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return false;
    }

    private static List<X509Certificate> loadCertificates(JarFile jarFile, JarEntry signatureEntry) {
        List<X509Certificate> certificates = new ArrayList<>();

        try {
            FileInputStream fis = new FileInputStream(jarFile.getName());
            byte[] buffer = new byte[1024];
            int length;
            while ((length = fis.read(buffer)) != -1) {
                // Read the signature entry
                if (length == signatureEntry.getSize()) {
                    fis.close();
                    fis = new FileInputStream(jarFile.getName());

                    // Skip to the beginning of the signature entry
                    fis.skip(signatureEntry.getOffset());

                    // Read the signature entry into a buffer
                    byte[] signatureBuffer = new byte[length];
                    fis.read(signatureBuffer);

                    // Load the certificates from the signature entry
                    CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
                    X509Certificate certificate = (X509Certificate) certificateFactory.generateCertificate(new ByteArrayInputStream(signatureBuffer));
                    certificates.add(certificate);

                    fis.close();
                    break;
                }
            }
        } catch (IOException | CertificateException e) {
            e.printStackTrace();
        }

        return certificates;
    }
}

使用方法:

String apkFilePath = "path_to_apk_file";
boolean hasV1Signature = ApkSignatureChecker.hasV1Signature(apkFilePath);
System.out.println("APK has V1 signature: " + hasV1Signature);
``
补全以下java类使调用时能检测传入的apk是否含有v1签名

原文地址: https://www.cveoy.top/t/topic/h7x1 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录