android - .apk 文件如何签名

标签 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 已签名,其中包含不同组件的单独哈希

如果你能指出详细的签名和验证过程的文档也会更好。

最佳答案

确实,这不是一个特定的 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/

相关文章:

Android,如何停止指针出现在 EditText 下方

python - 如何在 python 脚本上执行代码签名?

java - 向 jar 文件添加签名可防止其被加载

android - 在设置了最大高度和最大宽度的 ImageView 中定位图像

java - Android 子菜单不起作用

android - OpenGL ES 2.0 : How to render to a frameBuffer in a lower resolution for environment mapping?

java - 如何以编程方式验证使用 jarsigner 签名的 jar

c# - 安全 DSA 签名

ios - 企业或临时部署的 Xcode 保存失败 - "Code signing operation failed"

java - Android WebView 不保存游戏状态