.apk文件如何签名

时间:2010-08-02 20:43:42

标签: android code-signing

这不是关于如何签署.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已签名,其中包含针对不同组件的单个哈希值

如果您能够向我指出详细签名和验证过程的文档,那也会好得多。

2 个答案:

答案 0 :(得分:24)

事实上,这不是一个特定的Android问题,而是一般的Java问题,但无论如何我都会发布一个答案......

首先:只签署XXX.SF文件;这意味着XXX.SF文件中提到的所有文件都是“间接”签名的,因为XXX.SF包含它们的哈希值。事实上,所有不在“Meta-Inf”中的文件都应该有哈希值!整个.apk存档未签名。

XXX.SF文件或多或少是MANIFEST.MF文件的副本。有一行“SHA1-Digest-Manifest”是“MANIFEST.MF”本身的SHA-1哈希值; “SHA1-Digest”行不包含文件的哈希值,但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,...)。

答案 1 :(得分:4)

这实际上与Android无关。 APK文件使用jarsigner签名。 Here is a link to the manpage