1. 程式人生 > >Android 簽名(META-INF)

Android 簽名(META-INF)

在Android的apk包中含有一個叫做META-INF的資料夾,這個裡邊儲存的是關於簽名的一些資訊。

其中將apk包解壓出來,進入META-INF目錄,發現會有3個檔案:CERT.RSA,CERT.SF,MANIFEST.MF。

用記事本開啟MANIFEST.MF檔案,這是個可讀的文字檔案,大約內容如下:

Manifest-Version: 1.0
Created-By: 1.0 (Android)

Name: res/drawable-hdpi/shop_search_bg.png
SHA1-Digest: OgQ5gmKTFoxuZWAaKBBJKl1Oy24=

Name: res/drawable/merchant_btn_selector.xml
SHA1-Digest: AkxLT25+wtnL6DCN10rcSTpz6kM=

版本號以及對每一個檔案的雜湊值(BASE64)。包括資原始檔。這個是對每個檔案的整體進行SHA1 hash

然後是CERT.SF檔案,用記事本開啟,內容如下:

Signature-Version: 1.0
Created-By: 1.0 (Android)
SHA1-Digest-Manifest: I2tqVFgbG+PZh6o8SWuDePSrTcQ=

Name: res/drawable-hdpi/shop_search_bg.png
SHA1-Digest: twMIUeZAdwmMBjIDlo/5EiSFWj0=

Name: res/drawable/merchant_btn_selector.xml
SHA1-Digest: GJqtJ+iUO4Xrjgzri8nzR+GDLVU=

看到跟manifest.mf中的很類似,也是BASE64編碼的雜湊值,這個是對每個檔案的頭3行進行SHA1 hash。

這兩個檔案中的內容僅僅是個摘要,也就是僅僅對檔案做個hash。

最後一個檔案是CERT.RSA,這個檔案中放的是apk包的簽名,同時還有證書的公鑰。

一般來說,證書的內容是:開發者資訊+開發者公鑰 +CA的簽名( CA對前兩部分做hash值然後私鑰加密之後的密文)

驗證過程是:用CA公鑰對括號裡的內容解密,然後對前兩部分hash,跟CA的簽名進行對比,看是否相同。

暫時不知道Android中既然已經有了對整個檔案的摘要,為什麼還要弄個前3行的摘要。 

猜想:

 cert.rsa這個檔案中應該存放的是開發者資訊+開發者公鑰+開發者簽名【自己就是CA】(對前兩部分的hash用自己私鑰做加密),

解密過程應該是:首先提取自己公鑰,然後對自己加密的那部分解密,然後對前2部分做hash進行比對,模擬跟驗證證書。然後再用公鑰依次驗證每一個檔案的摘要看是否正確。