这不是关于如何签署 .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 已签名,其中包含不同组件的单独哈希
如果你能指出详细的签名和验证过程的文档也会更好。
最佳答案
确实,这不是一个特定的 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-摘要:"+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, ...)。
关于android - .apk 文件如何签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3391585/