如何获得APK签名签名?

Way*_*int 60 android certificate signature apk

有没有办法检索用于签署APK的密钥的签名?我用密钥库中的密钥签署了我的APK.如何以编程方式检索它?

Oll*_*e C 64

您可以使用PackageManager类访问APK的签名签名 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());
}
Run Code Online (Sandbox Code Playgroud)

我用它来比较我的调试密钥的哈希码,作为识别APK是调试APK还是发布APK的方法.

  • 有没有办法获得未安装的应用程序的签名?例如,如果我有一个.apk文件 (13认同)
  • 这种方法不是抗冲击的 (4认同)
  • 对于严重的情况,请不要使用`hashCode()`.例如,如果你想验证你想用右键签署交流一些其他的应用程序,使用加密的安全散列(如SHA256). (2认同)
  • @Ruzard是的,可以。您需要将未安装的apk推送到您的程序可以获取apk的位置,例如SD_CARD,然后使用context.getPackageManager()。getPackageAchiveInfo(NOT_INSTALL_APK_PATH,PackageManager.GET_SIGNATURES).signatures [0]获取其hashCode。并比较它们。祝好运 (2认同)
  • @CommonsWare 不应该 `hashCode` 返回内存中对象的 id 吗? (2认同)
  • @HosseinShahdoost 是的,他们已经覆盖了它,但使用它仍然不安全。计算出的哈希由 32 位组成,允许轻微的冲突。有关详细信息,请参阅 /sf/answers/4229114711/。 (2认同)

Yoj*_*mbo 28

包管理器将为您提供任何已安装包的签名证书.然后,您可以打印出签名密钥的详细信息,例如

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


She*_* Li 6

我的情况是我有一个预安装的apk,它使用了错误的密钥库。所以直接安装会因为签名不一致而失败。我需要先检查签名以确保可以顺利安装。

这是我的解决方案

该代码所示,您可以从已安装的apk获取签名。

细节:

Signature sig = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures[0];
Run Code Online (Sandbox Code Playgroud)

其次:获取releaseApk hashCode进行比较。就我而言,我从服务器上下载了该apk,并将其放在sd_card中。

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

最后,比较hashCode。

return sig.hashCode() == releaseSig.hashCode;
Run Code Online (Sandbox Code Playgroud)

我已经尝试了上面的代码,它工作正常。如果hashCode不同,则应该只卸载旧的apk,或者如果它是系统应用程序且设备已植根,则可以使用运行时删除它,然后安装新的签名apk。


归档时间:

查看次数:

77893 次

最近记录:

7 年,11 月 前