10

我想验证两个 APK 文件是否已使用相同的证书进行签名。

我有整个 Java SDK 可用,但出于跨平台的原因,我想从 Java 代码中获取它。

有任何想法吗?

4

3 回答 3

6

一切都是为了比较你的应用程序的签名

a) get signature of both aps 
b) check if sig.hashCode() == releaseSig.hashCode

1)通过使用android api运行时检查:

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

从文件:

 Signature releaseSig = context.getPackageManager()
          .getPackageAchiveInfo("/path2apk/app.apk",PackageManager.GET_SIGNATURES)
          .signatures[0];

2)在android之外获取签名见:

http://androidcracking.blogspot.com/2010/12/getting-apk-signature-outside-of.html

您可以使用:

 openssl pkcs7 -inform DER -in CERT.RSA -noout -print_certs -text
 unzip -p application.apk META-INF/CERT.RSA | keytool -printcert 

openssl的即时使用:

(解压缩和管道证书而不是定义 -infile 选项):

unzip -p application.apk META-INF/CERT.RSA 
             | openssl pkcs7 -inform DER -noout -print_certs -text

额外资源:

如何找出用于签署应用程序的密钥库?

如何获取 APK 签名签名?

我可以向您推荐 Scott Alexander-Bown (scottyab) 在这个主题中的一篇好文章

https://www.airpair.com/android/posts/adding-tampering-detection-to-your-android-app

于 2016-07-27T16:25:47.303 回答
5

在此处尝试此链接开发人员指南

您可以知道它们是使用相同的签名还是不使用具有创建日期的证书验证进行签名。

首先导航到终端中包含 .apk 的文件夹

  $ jarsigner -verify -verbose -certs my_application.apk
于 2014-12-30T17:25:09.757 回答
1

安卓应用

使用内置 API PackageManager.checkSignatures()

Java 应用程序

解决方案有点混乱,但仍然可行,只需深入PackageManager.checkSignatures()研究源代码并将实现移植到 Java。在 PackageManager 中,加载和检查签名的部分主要基于 Java API:

  • java.util.jar.JarEntry;
  • java.util.jar.JarFile;
  • java.security.PublicKey;
  • java.security.cert.Certificate;
  • java.security.cert.CertificateException;
  • java.security.cert.CertificateFactory;

大概的概念:

  1. 借用android.content.pm.Signature源代码并将其移植到 Java 中(需要剥离 Parcelable)
  2. 如何Signature从 apk 中收集/加载,查看android.content.pm.PackageParsercollectCertificates()中的loadCertificates()方法。
  3. 如何在android.server.pm.PackageManagerServicecheckSignatures()中检查/比较“签名”、签出和compareSignatures()方法。

希望这是有道理的。

于 2012-09-20T23:35:53.530 回答