返回介绍

12.2 Android 中签名流程

发布于 2024-10-10 22:32:18 字数 5193 浏览 0 评论 0 收藏 0

下面开始从源码中去分析 Android 中的签名机制和原理流程。因为网上没有找到 jarsigner 的源码,但是找到了 signapk 的源码,下面就来看看 signapk 的源码:源码位置是 com/android/signapk/sign.java。

通过上面的签名可以看到,Android 签名 apk 之后,会有一个 META-INF 目录,这里有三个文件:

·MANIFEST.MF

·CERT.SF

·CERT.RSA

下面来看看这三个文件到底是干啥的。

1.MANIFEST.MF 文件

这个文件主要包括 apk 文件中所有文件的数据摘要内容,如下所示:

下面来看看源码:

在 main 函数中,需要输入四个参数,然后开始写 MANIFEST.MF 文件内容:

进入方法 manifest.write(outputJar):

代码逻辑很简单,主要看那个循环的意思:除了三个文件(MANIFEST.MF、CERT.RSA、CERT.SF)之外都会对其他文件内容做一次 SHA1 算法,就是计算出文件的摘要信息,然后用 Base64 进行编码即可,下面用工具来做个案例看看是不是这样:首先安装工具:HashTab,这个工具网上有,可以自行搜索下载。然后网上搜索在线计算 Base64。

下面就开始验证工作吧。验证一下 AndroidManifest.xml 文件,首先在 MANIFEST.MF 文件中找到这个条目,记录 SHA1 的值,如下所示:

安装 HashTab 之后,找到 AndroidManifest.xml 文件,右击,选择 Hashtab,如图 12-7 所示。

复制 SHA-1 的值:9C64812DE7373B201C294101473636A3697FD73C,到上面的那个 Base64 转化网站,转化一下,如图 12-8 所示。

图 12-7 查看文件的 SHA-1 值

图 12-8 SHA-1 值转化

nGSBLec3OyAcKUEBRzY2o2l/1zw=和 MANIFEST.MF 中的条目内容一模一样。

那么从上面的分析就知道了,其实 MANIFEST.MF 中存储的是这样的内容:逐一遍历里面所有条目,如果是目录就跳过,如果是一个文件,就用 SHA1(或者 SHA256)消息摘要算法提取出该文件的摘要然后进行 BASE64 编码后,作为“SHA1-Digest”属性的值写入到 MANIFEST.MF 文件中的一个块中。该块还有一个“Name”属性,其值就是该文件在 apk 包中的路径。

2.CERT.SF 文件

这个文件主要是前面 MANIFEST.MF 文件的每个块内容的数据摘要信息,如下所示:

这里的内容感觉和 MANIFEST.MF 的内容差不多,来看看代码吧:

进入到 writeSignatureFile 方法中:

首先可以看到,需要对之前的 MANIFEST.MF 文件整个内容做一个 SHA1 放到 SHA1-Digest-Manifest 字段中。

看看 manifest 变量就是刚刚写入了 MANIFEST.MF 文件的,这个可以验证一下,如图 12-9 所示。

然后转化一下,如图 12-10 所示。

图 12-9 查看文件的 SHA-1 值

图 12-10 SHA-1 值转化成 Base64

看到了吧,和文件中的值是一样的,如下所示:

下面继续看代码,有一个循环:

这里还是用到了刚刚传入的 mainfest 变量,遍历它的条目内容,然后进行 SHA 算法计算,再用 Base64 计算一下。其实就是对 MANIFEST.MF 文件中的每个条目内容做一次 SHA,再保存一下即可。

做个例子验证一下:用 AndroidManifest.xml 为例,把 MANIFEST.MF 文件中的条目拷贝保存到 txt 文档中,如图 12-11 所示。

图 12-11 签名文件格式

这里需要注意的是,保存之后,需要添加两个换行,可以在代码中看到逻辑如下所示:

然后计算 txt 文档的 SHA 值,如图 12-12 和图 12-13 所示。

图 12-12 查看文件签名

图 12-13 Base64 转码

看到了吧,这里计算的值是一样的,如下所示:

到这里就知道 CERT.SF 文件做了什么,如下所示:

1)计算 MANIFEST.MF 文件的整体 SHA1 值,再经过 BASE64 编码后,记录在 CERT.SF 主属性块(在文件头上)的“SHA1-Digest-Manifest”属性值值下。

2)逐条计算 MANIFEST.MF 文件中每一个块的 SHA1,并经过 BASE64 编码后,记录在 CERT.SF 中的同名块中,属性的名字是“SHA1-Digest”。

3.CERT.RSA 文件

这个文件就是对前面 CERT.SF 文件做签名操作之后的结果,也就是前面提到的签名文件,如下所示:

看到都是二进制文件,因为 RSA 文件加密了,所以需要用 openssl 命令才能查看其内容,如下所示:

关于这些信息,可以参考图 12-14 的解释。

来看一下代码:

图 12-14 rsa 文件格式说明

这里会把之前生成的 CERT.SF 文件用私钥计算出签名,然后将签名以及包含公钥信息的数字证书一同写入 CERT.RSA 保存。CERT.RSA 是一个满足 PKCS7 格式的文件。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文