欢迎来到皮皮网官网

【nanopi 源码安装nginx】【魔盒meta源码】【async源码分析】walle源码阅读

时间:2024-12-23 11:31:09 来源:vb打铃源码

1.Android基础『V1V2V3签名』

walle源码阅读

Android基础『V1V2V3签名』

        基础概念

        签名:在 APK 中写入一个「指纹」。指纹写入以后,APK 中有任何修改,都会导致这个指纹无效,Android 系统在安装 APK 进行签名校验时就会不通过,从而保证了安全性。

        摘要算法: 使用一段简单的看上去随机的不可逆向的固定长度的字符串来表示一个文件的唯一性。 常见的摘要算法如MD5(个比特位)、SHA-1算法(//个比特位)。

        公钥密码体制:也称非对称算法,特点是公钥是公开的,私钥是保密的。常见的如:RSA。

        展开讨论一下RSA:

        Android中的签名方案

        V1 :基于jarsigner(JDK自带工具,使用keystore文件进行签名) 或 apksigner(Android专门提供的,使用pk8、x.pem进行签名)。keystore和pk8/x.pem可以相互转换。

        签名原理:首先keystore文件包含一个MD5和一个SHA1摘要。这也是很多开放平台需要我们上传的摘要数据。

        签名APK后会在META-INF文件夹下生产CERT.RSA、CERT.SF、MANIFEST.MF三个文件。

        在apk中,/META-INF文件夹中保存着apk的签名信息,一般至少包含三个文件,[CERT].RSA,[CERT].SF和MANIFEIST.MF文件。这三个文件就是对apk的签名信息。

        MANIFEST.MF中包含对apk中除了/META-INF文件夹外所有文件的签名值,签名方法是先SHA1()(或其他hash方法)在base()。存储形式是:Name加[SHA1]-Digest。

        [CERT].SF是对MANIFEST.MF文件整体签名以及其中各个条目的签名。一般地,如果是使用工具签名,还多包括一项。就是对MANIFEST.MF头部信息的签名,关于这一点前面源码分析中已经提到。

        [CERT].RSA包含用私钥对[CERT].SF的签名以及包含公钥信息的数字证书。

          是否存在签名伪造可能:

        修改(含增删改)了apk中的文件,则:校验时计算出的文件的摘要值与MANIFEST.MF文件中的条目不匹配,失败。

        修改apk中的文件+MANIFEST.MF,码阅nanopi 源码安装nginx则:MANIFEST.MF修改过的条目的摘要与[CERT].SF对应的条目不匹配,失败。

        修改apk中的文件+MANIFEST.MF+[CERT].SF,则:计算出的[CERT].SF签名与[CERT].RSA中记录的签名值不匹配,失败。

        修改apk中的文件+MANIFEST.MF+[CERT].SF+[CERT].RSA,则:由于证书不可伪造,[CERT].RSA无法伪造。

        V2 :7.0新增的

        签名后的包会被分为四部分

        1. Contents of ZIP entries(from offset 0 until the start of APK Signing Block)

        2. APK Signing Block

        3. ZIP Central Directory

        4. ZIP End of Central Directory

新应用签名方案的签名信息会被保存在区块2(APK Signing Block)中, 而区块1( Contents of ZIP entries )、区块3( ZIP Central Directory )、区块4( ZIP End of Central Directory )是受保护的,在签名后任何对区块1、3、4的修改都逃不过新的应用签名方案的检查。

        V3 :9.0新增的

格式大体和 v2 类似,在 v2 插入的签名块(Apk Signature Block v2)中,又添加了一个新快(Attr块)。

        在这个新块中,会记录我们之前的签名信息以及新的签名信息,以 密钥转轮的方案,来做签名的替换和升级。这意味着,只要旧签名证书在手,我们就可以通过它在新的 APK 文件中,更改签名 。

        v3 签名新增的新块(attr)存储了所有的签名信息,由更小的 Level 块,以链表的形式存储。

        其中每个节点都包含用于为之前版本的应用签名的签名证书,最旧的签名证书对应根节点,系统会让每个节点中的证书为列表中下一个证书签名,从而为每个新密钥提供证据来证明它应该像旧密钥一样可信。

        这个过程有点类似 CA 证书的证明过程,已安装的 App 的旧签名,确保覆盖安装的 APK 的新签名正确,将信任传递下去。

        注意:签名方式只支持升级不支持降级,如安装了V2的包,不能覆盖替换为V1的包。

        参考

        Android App签名(证书)校验过程源码分析

        新一代开源Android渠道包生成工具Walle

        Android 签名机制 v1、v2、v3

copyright © 2016 powered by 皮皮网   sitemap