【问题标题】:How does an .apk files get signed.apk 文件如何签名
【发布时间】:2011-03-24 10:11:31
【问题描述】:

这不是关于如何签署 .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 code-signing


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • Martin,我正在尝试使用 .NET 复制最后一步(生成 .RSA 文件)。签名的输入,我是否应该认为它是 .SF 文件中的文件条目(即 3 行)?此数据应编码为 UTF8 还是 Unicode?我无法为相同的证书/数据生成与 jarsigner 工具类似的相同输出(尽管)。任何提示都会有所帮助!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      • 2016-06-18
      • 1970-01-01
      相关资源
      最近更新 更多