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

标签 java android signature signing

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

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

有什么想法吗?

最佳答案

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

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

关于java - 验证两个 apk 文件是否使用相同的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12511533/

相关文章:

java - 如何使用 AspectJ 过滤方法的返回值?

java - 在 Java 中编码 "exception driven development"的性能成本?

java - Hibernate - 如何验证是否真的执行了批量插入

android - react native 图像选择器 showimagepicker

java - 有没有更强大的方法在 Android/Java/SQLite 中进行连接查询?

function - TypeScript 中错误抛出函数的签名

c# - 将signingCertificateV2属性添加到SignedCms

java - 在没有硬编码参数的情况下调用构造函数(耦合)

java - JPA:从另一个数据库中的表进行多对一映射

java - 如何在 Android 中的操作栏下方添加阴影?