这不是关于如何签署.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文件的签名存储在哪里?实际上签了什么?它可能是
如果您能够向我指出详细签名和验证过程的文档,那也会好得多。
答案 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