【问题标题】:Verifying that two apk files are signed with the same signature验证两个 apk 文件是否使用相同的签名进行签名
【发布时间】:2012-09-20 11:19:00
【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

  • 是否必须在运行时执行检查?或者是否可以使用 JDK 捆绑的工具之一进行检查?

标签: java android signature signing


【解决方案1】:

一切都是为了比较您的应用的签名

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

其他资源:

How do I find out which keystore was used to sign an app?

How to get APK signing signature?

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

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

【讨论】:

    【解决方案2】:

    在这里试试这个链接 developer guide

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

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

      $ jarsigner -verify -verbose -certs my_application.apk
    

    【讨论】:

      【解决方案3】:

      Android 应用程序

      使用内置 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. 如何从 apk 中收集/加载Signature,查看android.content.pm.PackageParser 中的collectCertificates() 和loadCertificates() 方法。
      3. 如何检查/比较“签名”,查看android.server.pm.PackageManagerService 中的checkSignatures() 和compareSignatures() 方法。

      希望这是有道理的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-28
        • 2016-04-01
        • 2022-01-13
        • 2013-07-01
        • 2010-10-22
        • 2014-03-22
        相关资源
        最近更新 更多