实战android打包和签名
作者:威威dett 时间:2023-11-18 10:23:50
小编在之前给大家介绍过很多android项目打包的经验,本篇内容我们通过一个项目实例来给大家讲解android每一步打包和签名的过程。
android打包
以下是原理图:
由android的项目经过编译和打包,形成了:
.dex 文件
resources.arsc
uncompiled resources
AndroidManifest.xml
解压了一个普通的apk文件,解压出来的文件如下:
classes.dex 是.dex文件。resources.arsc是resources resources文件。AndroidManifest.xml是AndroidManifest.xml文件。res是uncompiled resources。META-INF是签名文件夹。
其中resources.arsc相等于是资源文件的索引,方便查找资源文件
具体打包流程图:
android签名
android签名后文件中多了个META-INF其中有三个文件:
下面分析一下3个文件的具体如何生成的apksinger:
1、MANIFEST.MF
逐一遍历里面的所有条目,如果是目录或者三个文件(MANIFEST.MF,CERT.RSA,CERT.SF)就跳过,如果是一个文件,就用SHA1(或者SHA256)消息摘要算法提取出该文件的摘要然后进行BASE64编码后,作为“SHA1-Digest”属性的值写入到MANIFEST.MF文件中的一个块中。该块有一个“Name”属性,其值就是该文件在apk包中的路径。
2、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文件, 用私钥计算出签名, 然后将签名以及包含公钥信息的数字证书一同写入 CERT.RSA 中保存。CERT.RSA是一个满足PKCS7格式的文件。
为何要这么来签名
上面我们就介绍了签名apk之后的三个文件的详细内容,那么下面来总结一下,Android中为何要用这种方式进行加密签名,这种方加密是不是最安全的呢?下面我们来分析一下,如果apk文件被篡改后会发生什么。
首先,如果你改变了apk包中的任何文件,那么在apk安装校验时,改变后的文件摘要信息与MANIFEST.MF的检验信息不同,于是验证失败,程序就不能成功安装。
其次,如果你对更改的过的文件相应的算出新的摘要值,然后更改MANIFEST.MF文件里面对应的属性值,那么必定与CERT.SF文件中算出的摘要值不一样,照样验证失败。
最后,如果你还不死心,继续计算MANIFEST.MF的摘要值,相应的更改CERT.SF里面的值,那么数字签名值必定与CERT.RSA文件中记录的不一样,还是失败。
那么能不能继续伪造数字签名呢?不可能,因为没有数字证书对应的私钥。
所以,如果要重新打包后的应用程序能再Android设备上安装,必须对其进行重签名。
从上面的分析可以得出,只要修改了Apk中的任何内容,就必须重新签名,不然会提示安装失败,当然这里不会分析,后面一篇文章会注重分析为何会提示安装失败。
来源:http://blog.csdn.net/u013626215/article/details/78731567
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Java实现将彩色PDF转为灰度PDF的示例代码
![](https://img.aspxhome.com/file/2023/2/114062_0s.jpg)
Java反射机制的学习总结
![](https://img.aspxhome.com/file/2023/5/113375_0s.png)
Jetpack Compose常用组件详细介绍
![](https://img.aspxhome.com/file/2023/4/90134_0s.png)
Java元注解Retention代码示例介绍
C#中事件处理的个人体会
使用SpringBoot 配置Oracle和H2双数据源及问题
![](https://img.aspxhome.com/file/2023/7/64407_0s.png)
android ToolBar的简单使用
![](https://img.aspxhome.com/file/2023/4/137384_0s.gif)
SpringBoot在IDEA中实现热部署的步骤
![](https://img.aspxhome.com/file/2023/8/78008_0s.png)
git自定义_动力节点Java学院整理
![](https://img.aspxhome.com/file/2023/9/94349_0s.jpg)
spring boot补习系列之几种scope详解
![](https://img.aspxhome.com/file/2023/0/78060_0s.png)
基于App自适应draw9patch不失真背景的方法详解
![](https://img.aspxhome.com/file/2023/4/139244_0s.png)
Android Jetpack中Room的使用
Java读取并下载网络文件的方法
Android利用Canvas标点画线并加入位移动画(2)
![](https://img.aspxhome.com/file/2023/9/119089_0s.jpg)
Unity实现场景加载功能
![](https://img.aspxhome.com/file/2023/5/94565_0s.jpg)
详解java接口(interface)在不同JDK版本中的变化
详解Android MVP开发模式
![](https://img.aspxhome.com/file/2023/7/106007_0s.png)
解决eclipse上传svn忽略target文件夹的坑
![](https://img.aspxhome.com/file/2023/5/58445_0s.jpg)