如何判断 Android 应用的 Apk 签名是不是一致?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何判断 Android 应用的 Apk 签名是不是一致?相关的知识,希望对你有一定的参考价值。

我自己的判断方法是下载的应用安装能成功覆盖原应用则签名一致。但如何不通过安装 Apk 判断签名一致?

android应用的发布形式apk中包含的签名加密方法除了RSA还有DSA,所以不能只从apk中提取常见的META-INF/CERT.RSA,应该是检查apk中具体的签名文件。
1.FILE="yourapp.apk"
cert_XSA=`jar tf $FILE | grep SA`
此时得到的cert_XSA可能是META-INF/*.RSA或者META-INF/*.DSA。

2.apk中提取具体的签名文件。
jar xf $FILE $cert_XSA
此时会在当前目录得到cert_XSA文件。

3.对于得到的签名文件,提取其中签名的MD5值
keytool -printcert -file $cert_XSA | grep MD5 > "$FILE.certMD5"
这时候yourapp.certMD5这个文件中就保存了yourapp.apkk中的签名MD5值。

4.最后比较两个app的签名可以用diff
FILE1="yourapp1.apk"
FILE2="yourapp2.apk"
//经过上述步骤得到$FILE1.certMD5和$FILE2.certMD5
certMD5_diff=`diff $FILE1.certMD5 $FILE2.certMD5`
if [ "$certMD5_diff" = "" ]; then
echo "$FILE1.certMD5 == $FILE2.certMD5"
fi
若输出yourapp1.apk.certMD5 == yourapp2.apk.certMD5那么这两个应用的签名就一致
参考技术A 将apk当做压缩包打开,直接提取签名存放的META-INF,手动比对修改日期,MD5之类的。 参考技术B 在程序中获取APK的签名时,通过signature方法进行获取,如下:
packageInfo = manager.getPackageInfo(pkgname,PackageManager.GET_SIGNATURES);
signatures = packageInfo.signatures;
for (Signature signature : signatures)
builder.append(signature.toCharsString());

signature = builder.toString();

所以一般的程序就是在代码中通过判断signature的值,来判断APK是否被重新打包过。
参考技术C 将apk当做压缩包打开,直接提取签名存放的META-INF,手动比对修改日期,MD5之类的 参考技术D https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk
下载一个这个安装到手机上,输入你的应用包名,可以获得签名信息

以上是关于如何判断 Android 应用的 Apk 签名是不是一致?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 APK 是不是已签名或“调试构建”?

判断APK是不是为Debug包

如何检测android 文件签名成功(转帖)

Android APK如何签名

Android 是怎么判断某个APK文件是不是已经安装

Android 是怎么判断某个APK文件是不是已经安装