.apk文件如何签名

Sze*_*eri 20 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=
Run Code Online (Sandbox Code Playgroud)

还有一个名为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-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,...).


Com*_*are 5

这其实和Android无关。APK 文件使用jarsigner. 这是联机帮助页的链接