2010-08-02 106 views
20

這不是關於如何簽名.apk文件的問題。我想知道簽名實際上意味着什麼以及如何實施。.apk文件如何得到簽名

在.apk文件中有META-INF文件夾,裏面有兩個文件。

第一個是包含CERT.SF散列SHA1各種部件,看起來像這樣:

Name: res/layout/main.xml 
SHA1-Digest: Cox/T8fN1X9Hv4VqjH9YKqc/MsM= 

Name: AndroidManifest.xml 
SHA1-Digest: wZ418H9Aix1LNch3ci7c+cHyuZc= 

Name: resources.arsc 
SHA1-Digest: P+uoRrpFyVW6P3Wf+4vuR2ZSuXY= 

Name: classes.dex 
SHA1-Digest: cN3zXtGii9zuTOkBqDTLymeMZQI= 

還有一個叫CERT.RSA文件。我認爲這是驗證簽名的公鑰。

我的問題是,整個.apk文件的簽名在哪裏存儲?而實際簽署的是什麼?它可以被用來作爲一個單一的二進制對象要麼

  • .apk文件,這是簽署
  • 或CERT.SF簽署其中包含不同的組件

這也將是多個人哈希如果您能指出我詳細的簽名和驗證流程的文檔,那更好。

回答

24

事實上,這不是一個具體的Android問題,而是一個Java功能於一般性的問題,但是我無論如何張貼的答案...

首先:只有XXX.SF文件進行簽名;這意味着XXX.SF文件中提到的所有文件都是「間接」簽名的,因爲XXX.SF包含它們的散列。事實上,所有不在「Meta-Inf」中的文件都應該有哈希值!整個.apk存檔未簽名。

XXX.SF文件或多或少是MANIFEST.MF文件的副本。有一行「SHA1-Digest-Manifest」,它是「MANIFEST.MF」本身的SHA-1哈希; SHA1-摘要「行不包含文件的哈希值,而是Manifest.MF文件中樹對應行的哈希值,如下所示:

SHA1(」名稱:文件名「+ CR + LF +」SHA1 -Digest:「+ SHA1(file_content)+ CR + LF + CR + LF)

XXX.DSA/.RSA的文件格式與S/MIME電子郵件簽名(用於XXX的內容)相同。 SF),但是數據不是base64編碼的,並且不使用頭部/尾部線。 「openssl smime -sign -outform DER」會創建這種格式。

多個證書可用於簽署ZIP文件。在這種情況下,將存在多對(XXX.SF/.RSA,YYY.SF/.RSA,...)。

+0

馬丁,我試圖複製使用.NET的最後一步(生成.RSA文件)。 要輸入符號,我應該認爲它是.SF文件中的文件條目(即3行)? 這個數據應該被編碼爲UTF8還是Unicode? 我無法爲相同證書/數據生成與jarsigner工具相同的輸出(儘管)。 任何提示都會有所幫助! – 2015-08-31 08:44:03