我想验证两个 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
额外资源:
我可以向您推荐 Scott Alexander-Bown (scottyab) 在这个主题中的一篇好文章
https://www.airpair.com/android/posts/adding-tampering-detection-to-your-android-app
在此处尝试此链接开发人员指南
您可以知道它们是使用相同的签名还是不使用具有创建日期的证书验证进行签名。
首先导航到终端中包含 .apk 的文件夹
$ jarsigner -verify -verbose -certs my_application.apk
使用内置 API PackageManager.checkSignatures()。
解决方案有点混乱,但仍然可行,只需深入PackageManager.checkSignatures()
研究源代码并将实现移植到 Java。在 PackageManager 中,加载和检查签名的部分主要基于 Java API:
大概的概念:
Signature
从 apk 中收集/加载,查看android.content.pm.PackageParsercollectCertificates()
中的loadCertificates()
方法。checkSignatures()
中检查/比较“签名”、签出和compareSignatures()
方法。希望这是有道理的。