Program Tip

APK 서명 서명을 얻는 방법은 무엇입니까?

programtip 2020. 12. 8. 19:53
반응형

APK 서명 서명을 얻는 방법은 무엇입니까?


APK에 서명하는 데 사용 된 키의 서명을 검색하는 방법이 있습니까? 내 키 저장소의 키로 APK에 서명했습니다. 프로그래밍 방식으로 검색하려면 어떻게해야합니까?


PackageManager 클래스 http://developer.android.com/reference/android/content/pm/PackageManager.html을 사용하여 이와 같은 APK의 서명 서명에 액세스 할 수 있습니다.

Signature[] sigs = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures;
for (Signature sig : sigs)
{
    Trace.i("MyApp", "Signature hashcode : " + sig.hashCode());
}

APK가 디버그 APK인지 릴리스 APK인지 식별하는 방법으로 디버그 키의 해시 코드와 비교하는 데 사용했습니다.


패키지 관리자는 설치된 모든 패키지에 대한 서명 인증서를 제공합니다. 그런 다음 서명 키의 세부 정보를 인쇄 할 수 있습니다.

final PackageManager packageManager = context.getPackageManager();
final List<PackageInfo> packageList = packageManager.getInstalledPackages(PackageManager.GET_SIGNATURES);

for (PackageInfo p : packageList) {
    final String strName = p.applicationInfo.loadLabel(packageManager).toString();
    final String strVendor = p.packageName;

    sb.append("<br>" + strName + " / " + strVendor + "<br>");

    final Signature[] arrSignatures = p.signatures;
    for (final Signature sig : arrSignatures) {
        /*
        * Get the X.509 certificate.
        */
        final byte[] rawCert = sig.toByteArray();
        InputStream certStream = new ByteArrayInputStream(rawCert);

        try {
            CertificateFactory certFactory = CertificateFactory.getInstance("X509");
            X509Certificate x509Cert = (X509Certificate) certFactory.generateCertificate(certStream);

            sb.append("Certificate subject: " + x509Cert.getSubjectDN() + "<br>");
            sb.append("Certificate issuer: " + x509Cert.getIssuerDN() + "<br>");
            sb.append("Certificate serial number: " + x509Cert.getSerialNumber() + "<br>");
            sb.append("<br>");
        }
        catch (CertificateException e) {
            // e.printStackTrace();
        }
    }
}

제 상황은 잘못된 키 저장소를 사용하는 사전 설치된 apk가 있다는 것입니다. 따라서 직접 설치는 서명이 일치하지 않아 실패 할 수 있으며, 원활하게 설치할 수 있도록 서명을 먼저 확인해야합니다.

여기 내 해결책이 있습니다.

이 코드 에서 알 수 있듯이 설치된 APK에서 서명을 얻을 수 있습니다.

세부:

Signature sig = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures[0];

둘째 : 비교할 releaseApk hashCode를 가져옵니다. 제 경우에는 서버에서이 apk를 다운로드하여 sd_card에 넣었습니다.

Signature releaseSig = context.getPackageManager().getPackageArchiveInfo("/mnt/sdcard/myReleaseApk.apk", PackageManager.GET_SIGNATURES).signatures[0];

마지막으로 hashCode를 비교합니다.

return sig.hashCode() == releaseSig.hashCode;

위의 코드를 시도했지만 정상적으로 작동합니다. hashCode가 다른 경우 이전 apk를 제거 하거나 시스템 앱이고 기기가 루팅 된 경우 런타임을 사용하여 제거 하고 새 서명 apk를 설치할 수 있습니다.

참고URL : https://stackoverflow.com/questions/5578871/how-to-get-apk-signing-signature

반응형