Как получить подпись APK подписи? - PullRequest
58 голосов
/ 07 апреля 2011

Есть ли способ получить подпись ключа, используемого для подписи APK? Я подписал свой APK с моим ключом от моего хранилища ключей. Как я могу получить это программно?

Ответы [ 3 ]

62 голосов
/ 07 апреля 2011

Вы можете получить доступ к подписи APK, как это, используя класс PackageManager http://developer.android.com/reference/android/content/pm/PackageManager.html

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.

27 голосов
/ 30 апреля 2013

Менеджер пакетов выдаст вам сертификат подписи для любого установленного пакета. Затем вы можете распечатать информацию о ключе подписи, например,

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();
        }
    }
}
3 голосов
/ 27 июля 2016

Моя ситуация такова, что у меня есть предустановленный apk, который использует неправильное хранилище ключей. Так что прямая установка даст сбой из-за несогласованности подписи. Сначала мне нужно проверить подпись, чтобы убедиться, что ее можно установить без проблем.

Вот мое решение .

Как говорит этот код , вы можете получить подпись с установленного apk.

подробности:

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

Во-вторых: получить хэш-код releaseApk для сравнения. В моем случае я скачал этот apk со своего сервера и поместил в sd_card.

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

Наконец, сравните хэш-код.

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

Я пробовал код выше, он работает просто отлично. Если хэш-код отличается, вам нужно просто удалить старый apk или если это системное приложение и устройство рутировано, вы можете просто использовать среду выполнения, чтобы удалить его , а затем установить новая подпись apk.

...