【发布时间】:2012-09-20 11:19:00
【问题描述】:
我想验证两个 APK 文件是否已使用相同的证书进行签名。
我有整个 Java SDK 可用,但出于跨平台的原因,我想从 Java 代码中获取它。
有什么想法吗?
【问题讨论】:
-
是否必须在运行时执行检查?或者是否可以使用 JDK 捆绑的工具之一进行检查?
标签: java android signature signing
我想验证两个 APK 文件是否已使用相同的证书进行签名。
我有整个 Java SDK 可用,但出于跨平台的原因,我想从 Java 代码中获取它。
有什么想法吗?
【问题讨论】:
标签: java android signature signing
一切都是为了比较您的应用的签名
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
【讨论】:
在这里试试这个链接 developer guide
并且您可以知道它们是使用相同的签名还是不使用具有创建日期的证书验证来签名。
首先导航到终端中包含 .apk 的文件夹
$ jarsigner -verify -verbose -certs my_application.apk
【讨论】:
使用内置 API PackageManager.checkSignatures()。
解决方案有点混乱但仍然可行,只需深入PackageManager.checkSignatures() 源代码并将实现移植到Java。在PackageManager中,加载和检查签名的部分主要是基于Java API:
总体思路:
Signature,查看android.content.pm.PackageParser 中的collectCertificates() 和loadCertificates() 方法。checkSignatures() 和compareSignatures() 方法。希望这是有道理的。
【讨论】: