当前位置: 首页 > 知识库问答 >
问题:

验证两个apk文件是否使用相同的签名进行签名

司徒志强
2023-03-14

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

我有整个JavaSDK可用,但想从Java代码使跨平台的原因。

有什么想法吗?

共有3个答案

法烨华
2023-03-14

使用内置API PackageManager。checkSignatures()。

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

  • java。util。罐子Jarrentry
  • java。util。罐子JarFile
  • java。安全公钥
  • java。安全证书
  • java。安全证书例外
  • java。安全证书工厂

总体思路:

  1. 借用android.content.pm.签名源代码并将其移植到Java(需要剥离Parcelable)
  2. 如何从apk收集/加载Signature,请查看android.content.pm.PackageParser中的CollectCerates()loadCerates()方法。
  3. 如何检查/比较'签名',检查出check Signature()compareSignature()在android.server.pm.PackageManagerService中的方法。

希望这有意义。

鲍驰
2023-03-14

请尝试此处的链接开发者指南

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

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

  $ jarsigner -verify -verbose -certs my_application.apk
范瀚昂
2023-03-14

所有关于是比较您的应用程序的签名

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的即时使用:

(解压缩

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

额外资源:

如何找出哪个密钥库用于签署应用程序

如何获得APK签名?

我可以向您推荐一篇由Scott Alexander-Bown撰写的关于这个主题的好文章。

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

 类似资料:
  • 正如标题所说,我想知道给定的PDF文件是否已经过数字签名。 我用iText签署了它,但我不知道它是否已经签署,以最终辞职或采取其他行动。 有没有简单的方法(可能使用iText)?

  • 我在理解OpenSSL的签名和验证过程时遇到了一些困难。 我有一个小型证书层次结构:根证书=>子证书=>结束实体证书。我想拥有来自最终实体CA的代码签名证书,因此创建了一个密钥对并请求CSR: 非常感谢。

  • 我试图用OpenSSL验证一个PE文件的证书/签名(或者实际上用Python,但是看起来Python在证书处理方面很糟糕)。 我已从PE文件中提取了DER PKCS7证书,如下所述:http://blog.didierstevens.com/2008/01/11/the-case-of-the-missing-digital-signatures-tab/ 我已经创建了一个没有校验和和签名数据的P

  • 我正在开发一个非google play应用程序,它将作为一个未签名的发行版apk交付给设备制造商,他们将用自己的私有系统密钥签名来签名。 系统签名是必不可少的,因为应用程序使用具有保护级别signatureOrSystem的权限。由于该应用程序不会作为系统特权应用程序安装,因此必须使用系统的签名进行签名。 由于我无法访问最终签名的apk(或签名密钥本身),我不知道如何测试我正在交付的产品(在真实的

  • 我从应用程序开发人员那里得到了更新的代码和apk。我已经用我自己的keystore文件重建了应用程序,并签署了应用程序,上传到商店,收到“上传的APK与你以前的APK签署了不同的证书”。 我通过以下方式检查了更新的apk sha1文件:

  • 我正在编写一些代码,试图对一些数据进行签名。在将openssl生成的私钥转换为Java密钥库之后,我将Java签名类与SHA256withRSA一起使用。我试图确认openssl中Java类返回的签名,但由于某些原因,我无法让openssl进行验证。我最终需要在iOS Swift 3中实现这个签名验证,但在找到库之前,我想尝试根据openssl标准检查Java签名。 例如,我从我们的登录服务器得到