实战android打包和签名

 更新时间:2017年12月07日 15:20:28   作者:威威dett  
本篇文章给大家通过实例讲解了如何对android项目打包和签名,并把用到的文件和流程做了注视,需要的朋友参考一下吧。

小编在之前给大家介绍过很多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中的任何内容,就必须重新签名,不然会提示安装失败,当然这里不会分析,后面一篇文章会注重分析为何会提示安装失败。

相关文章

  • android自动化测试知识点总结

    android自动化测试知识点总结

    在本文里小编给大家分享了关于android自动化测试入门的相关知识点,需要的朋友们跟着参考下吧。
    2019-06-06
  • Android ListView详解

    Android ListView详解

    listview控件在项目开发过程中经常会用到,本文给大家分享android listview相关知识,感兴趣的朋友一起学习吧
    2015-12-12
  • android实现动态显隐进度条

    android实现动态显隐进度条

    这篇文章主要为大家详细介绍了android实现动态显隐进度条,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Android Drawable必备知识小结

    Android Drawable必备知识小结

    这篇文章主要为大家详细了Android Drawable必备基础知识 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • Android实现网络多线程断点续传下载实例

    Android实现网络多线程断点续传下载实例

    本示例介绍在Android平台下通过HTTP协议实现断点续传下载。具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-10-10
  • Android应用中图片浏览时实现自动切换功能的方法详解

    Android应用中图片浏览时实现自动切换功能的方法详解

    这篇文章主要介绍了Android应用中图片浏览时实现自动切换功能的方法,文中还讲解了一个触摸大图进行图片切换的深入功能,需要的朋友可以参考下
    2016-04-04
  • Android 中对于图片的内存优化方法

    Android 中对于图片的内存优化方法

    Android 中对于图片的内存优化方法,需要的朋友可以参考一下
    2013-03-03
  • 详解如何在Flutter中集成华为认证服务

    详解如何在Flutter中集成华为认证服务

    这篇文章主要介绍了详解如何在Flutter中集成华为认证服务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • 基于Android如何实现将数据库保存到SD卡

    基于Android如何实现将数据库保存到SD卡

    有时候为了需要,会将数据库保存到外部存储或者SD卡中(对于这种情况可以通过加密数据来避免数据被破解),本文给大家分享Android如何实现将数据库保存到SD卡,对android数据库sd卡相关知识感兴趣的朋友一起学习吧
    2015-12-12
  • Kotlin ContentProvider使用方法介绍

    Kotlin ContentProvider使用方法介绍

    ContentProvider内容提供者,主要用于再不同的应用程序之前实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另外一个程序的数据,同时还能保证数据的安全性
    2022-09-09

最新评论