Android 比较证书序列号以验证已安装的应用程序和APK文件

Android 比较证书序列号以验证已安装的应用程序和APK文件,android,certificate,apk,Android,Certificate,Apk,我有一个已安装的应用程序和APK文件,并希望验证已安装的应用程序和APK文件是否使用相同的证书签名。我使用的方法是比较证书序列号: 获取已安装应用的证书序列号: Signature sig = context.getPackageManager().getPackageInfo("com.myapp", PackageManager.GET_SIGNATURES).signatures[0]; CertificateFactory cf = CertificateFactory.getInsta

我有一个已安装的应用程序和APK文件,并希望验证已安装的应用程序和APK文件是否使用相同的证书签名。我使用的方法是比较证书序列号:

获取已安装应用的证书序列号:

Signature sig = context.getPackageManager().getPackageInfo("com.myapp", PackageManager.GET_SIGNATURES).signatures[0];
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate) cf.generateCertificate(new ByteArrayInputStream(sig.toByteArray()));
Log.d(TAG, "SerialNumber: " + cert.getSerialNumber().toString(16));
获取APK文件的证书序列号:

unzip -p build/android/bin/MyApp.apk META-INF/*.RSA | keytool -printcert | grep Serial
所以我收到的序列号如下:
4f2777710


我想知道这个方法是否足够好,或者还有其他更好的方法吗?

这是一本很棒的读物。在本文中,Scott Alexander讨论了如何通过比较应用程序当前签署的证书和应该签署的证书来验证apk。这篇文章希望能引导你朝着正确的方向前进。

这是一篇很好的文章,可以实现篡改预防,但是它对实现我的目标没有多大帮助。我尝试将已安装应用的证书与相应的APK文件(针对每个应用)进行比较。使用证书的序列号对我来说似乎不够好。我尝试比较证书MD5指纹。使用来自和的代码,而不是获取公钥的摘要,我获取证书本身的摘要&能够将其与keytool生成的指纹相匹配。也许比较MD5指纹更好?