標籤:

如何判斷 Android 應用的 Apk 簽名是否一致?

我自己的判斷方法是下載的應用安裝能成功覆蓋原應用則簽名一致。但如何不通過安裝 Apk 判斷簽名一致?


畢設做的是Android應用重打包檢測,首先就需要批量檢測Android應用之間簽名是否一致。所以在這裡介紹一下在終端中如何寫腳本或者直接輸入命令批量檢測應用簽名是否一致。

Android應用的發布形式apk中包含的簽名加密方法除了RSA還有DSA,所以不能只從apk中提取常見的META-INF/CERT.RSA,第一步應該是檢查apk中具體的簽名文件是什麼。

FILE="yourapp.apk"
cert_XSA=`jar tf $FILE | grep SA`

此時得到的cert_XSA可能是META-INF/*.RSA或者META-INF/*.DSA。

接下來從apk中提取具體的簽名文件。

jar xf $FILE $cert_XSA

此時會在當前目錄得到cert_XSA文件。

然後對於得到的簽名文件,提取其中籤名的MD5值

keytool -printcert -file $cert_XSA | grep MD5 &> "$FILE.certMD5"

這時候yourapp.certMD5這個文件中就保存了yourapp.apkk中的簽名MD5值。

最後比較兩個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那麼這兩個應用的簽名就一致。


剛發現兩個月前寫的草稿,忘了當時為什麼沒立刻發布了,不知道還用不用得上?

----

可以比對apk簽名的fingerprint。

假定安裝了JDK,如果想查HelloWorld.apk所使用的簽名的fingerprint,可以這樣做:

1. 查找apk里的rsa文件

(Windows)

&> jar tf HelloWorld.apk |findstr RSA

(Linux)

$ jar tf HelloWorld.apk |grep RSA

META-INF/CERT.RSA

2. 從apk中解壓rsa文件

jar xf HelloWorld.apk META-INF/CERT.RSA

3. 獲取簽名的fingerprints

keytool -printcert -file META-INF/CERT.RSA

...

Certificate fingerprints:

MD5: BC:6D:BD:6E:49:69:2A:57:A8:B8:28:89:04:3B:93:A8

SHA1: 0D:DF:76:F4:85:96:DF:17:C2:68:1D:3D:FF:9B:0F:D2:A1:CF:14:60

Signature algorithm name: SHA1withRSA

Version: 3

...

4. 清理工作,刪除rsa文件

(Windows)

rmdir /S /Q META-INF

(Linux)

rm -rf META-INF

如果你想知道兩個apk是不是用的同一個簽名,那比一下它們簽名的MD5碼(或SHA1碼)是不是一樣就行了。


借鑒了各位的回答,寫了一個win下的bat腳本

拖動apk文件至該腳本上即可獲取簽名信息.

@echo off
set filename=%~n1%~x1
cd %~dp1
echo 以下是%filename%的簽名信息:
echo ----------------------------------------------------------
keytool -list -printcert -jarfile "%filename%"
pause


寫了一個簡單的shell腳本,輸出證書MD5指紋信息,用法 source echo.sh input.apk

echo.sh

#/bin/sh
cert_XSA=`jar tf $1 | grep SA` #獲取簽名文件在Apk中路徑, $1為輸入的apk
#echo $cert_XSA
jar xf $1 $cert_XSA #提取簽名文件
echo --------------------------------------------------------------------------
echo 證書MD5指紋:`keytool -printcert -file $cert_XSA | grep MD5`
echo --------------------------------------------------------------------------
rm -rf `dirname $cert_XSA` #刪除提取的文件夾


額,簽名的話,其實還是分為兩種吧,一個是類似於MD5值的文件校驗,目的就是為了辨別文件是否被修改,還有一種是開發者自己的簽名為的是能夠升級,也就是說安裝的時候能夠覆蓋。


將apk當做壓縮包打開,直接提取簽名存放的META-INF,手動比對修改日期,MD5之類的。


上面的方式用cmd可以執行么?


有個問題諮詢一下,樓主是否知道,在apk的簽名文件中,那三個文件之間的關聯關係?


可以試試愛內測,一鍵上傳文件就可以得到檢測報告,用起來還是挺方便的


推薦閱讀:

TAG:Android | Apk |