1. 程式人生 > >apk簽名機制與SHA1演算法

apk簽名機制與SHA1演算法

前幾天又碰到高德地圖申請key的時候,需要一個SHA1值,發現自己對簽名這塊沒有足夠了解,今天就做個總結。

1.SHA1演算法

sha1用於數字簽名,將一段訊息生成一個160位的訊息摘要,我們可以通過訊息摘要來驗證訊息的完整性。


2.apk的簽名機制

將apk解壓,可以看到一個META-INF目錄,裡面就存放著Android對該apk的簽名信息。


(1)MANIFEST.MF:摘要檔案。Android對apk的每一個檔案用SHA1生成摘要,再用Base64進行編碼,得到一個值用SHA1-Digest命名。

(2)CERT.SF:這是對第一步生成MANIFEST.MF摘要檔案的簽名。先計算MANIFEST.MF的整體SHA1值,再用base64編碼作為“SHA1-Digest-Manifest”的值,再分別計算每一個塊的SHA1,作為“SHA1-Digest”的值。

注意:這裡用的是SHA1_RSA演算法,用開發者的私鑰進行簽名,安裝時用公鑰來解密,將解密後的檔案與第一步的摘要檔案對比,比對看內容是否被異常修改。開發者可以修改程式,並生成新的MANIFEST.MF摘要檔案,但是沒有私鑰,無法生成正確的CERT.SF簽名檔案,這裡就保證了安裝包的安全性。


 (3)CERT.RSA證書檔案:用私鑰計算出CERT.SF檔案的簽名並將包含公鑰的數字證書一同儲存起來。這裡是一個二進位制檔案,用RSA加密了,可以用openssl命令檢視。我們可以用dos命令  keytool -printcert -file CERT.RSA   檢視具體包的rsa資訊。




3.keystore檔案

keyTool是java的一個證書管理工具,將金鑰與證書存放在一個keystore的檔案中。keytool在jdk中,可以用來生成keystore檔案。

keystore中包含兩種資料:

(1)金鑰:包含私鑰與配對公鑰(非對稱加密)

(2)證書:只包含公鑰



4.總結

(1)資料指紋:對一個數據源進行SHA1/md5演算法,得到一個唯一的值

(2)簽名檔案技術:資料指紋+rsa演算法

(3)證書檔案:包含了公鑰資訊和其他加密資訊