一、什么是签名?

  1. 是确保消息来源的真实性

  2. 是确保消息不会被第三方篡改


1.基本信息基础必备

1.1 消息摘要

消息摘要,又称数字摘要 或 数字指纹.  简单来说,消息摘要就是在消息数据上,执行一个单向的 Hash 函数,生成一个固定长度的Hash值,这个Hash值即是消息摘要。

正是由于以上特点,消息摘要算法被广泛应用在“数字签名”领域,作为对明文的摘要算法。著名的消息摘要算法有 RSA 公司的 MD5 算法和 SHA-1 算法及其大量的变体。

SHA-256 是 SHA-1 的升级版,现在 Android 签名使用的默认算法都已经升级到 SHA-256 了。

消息摘要的这种特性,很适合来验证数据的完整性。比如:在网络传输过程中下载一个大文件 BigFile,我们会同时从网络下载 BigFile 和 BigFile.md5,BigFile.md5 保存 BigFile 的摘要,我们在本地生成 BigFile 的消息摘要和 BigFile.md5 比较,如果内容相同,则表示下载过程正确。

注意,消息摘要只能保证消息的完整性,并不能保证消息的不可篡改性。


1.2 数字签名

先了解一下RAS

  • 加密:公钥加密,私钥解密的过程,称为“加密”。因为公钥是公开的,任何公钥持有者都可以将想要发送给私钥持有者的信息进行加密后发送,而这个信息只有私钥持有者才能解密。

  • 签名: 私钥加密,公钥解密的过程,称为“签名”。它和加密有什么区别呢?因为公钥是公开的,所以任何持有公钥的人都能解密私钥加密过的密文,所以这个过程并不能保证消息的安全性,但是它却能保证消息来源的准确性和不可否认性,也就是说,如果使用公钥能正常解密某一个密文,那么就能证明这段密文一定是由私钥持有者发布的,而不是其他第三方发布的,并且私钥持有者不能否认他曾经发布过该消息。故此将该过程称为“签名”。


总结: 

1、如何确保消息来源的真实性?

其实就是保证我们APP应用的唯一性质,方案就是上面给大家介绍的数字签名,使用RSA的私钥进行签名,来保证我们项目的唯一性,真实质。

2、保证APP应用来源的真实性实现方案?

  1. 单纯的数字签名也可以成功签名的一种验证方案。但是比较耗时。因为它会把所有的文件进行加密解密,这个过程是很耗时的

       2.针对方案以进行优化

  • 先摘要算法对所有文件消息进行摘要。

  • 再把摘要值用信源的私钥加密。

  • 几乎所有的数字签名方案都要和快速高效的摘要算法(Hash函数)一起使用,当公钥算法与摘要算法结合起来使用时,便构成了一种有效地数字签名方案。

最终采用数字签名是非对称加密技术 + 消息摘要技术的结合。

3.如何保证公钥不被篡改呢?

  • 上面技术使用的前提是大家都先得到正确的公钥。如果公钥被篡改了,那么正确的公钥也会不能解密的。

  • 使用数字证书,来保证我们公钥的唯一性。

3.1 数字证书

数字证书是一个经证书授权(Certificate Authentication)中心数字签名的包含公钥拥有者信息以及公钥的文件。数字证书的格式普遍采用的是 X.509 V3 国际标准,一个标准的 X.509 数字证书通常包含以下内容:

总结: 

  • 证书里面有公钥

  • 使用的签名算法( 哈希值生成算法)

  • 对证书的数字签名,把证书和数字指纹放在一起,在使用证书的时候,根据签名算法计算一下证书的数字指纹,如果数字指纹对的上,就说没有纂改过

数字签名和签名验证的大体流程(签名文件和和验签)

签名流程总结:

  1. 首先对项目的文件通过摘要算法,获取hash值,在通过签名者私钥进行签名。

  2. 把签名文件(认证证书) 和 签名 合并成签名

验证流程:

  1. 得到签名文件,拿到签体,然后得到摘要算法获取hash值

  2. 使用签名的公钥解密散列值 hash值, 跟1比较, 一直说明签名有效


2.1 签名工具

2.1.1Android 应用的签名工具有两种:

  • jarsigner:jdk 自带的签名工具,可以对 jar 进行签名。使用 keystore 文件进行签名。生成的签名文件默认使用 keystore 的别名命名。

  • signAPK:Android sdk 提供的专门用于 Android 应用的签名工具。使用 pk8、x509.pem 文件进行签名。其中 pk8 是私钥文件,x509.pem 是含有公钥的文件。生成的签名文件统一使用“CERT”命名。

2.1.2 签名过程

首先我们任意选取一个签名后的 APK(Sample-release.APK)解压

MANIFEST.MF

该文件中保存的内容其实就是逐一遍历 APK 中的所有条目,如果是目录就跳过,如果是一个文件,就用 SHA1(或者 SHA256)消息摘要算法提取出该文件的摘要然后进行 BASE64 编码后,作为“SHA1-Digest”属性的值写入到 MANIFEST.MF 文件中的一个块中。该块有一个“Name”属性, 其值就是该文件在 APK 包中的路径。

CERT.SF

  • SHA1-Digest-Manifest-Main-Attributes:对 MANIFEST.MF 头部的块做 SHA1(或者SHA256)后再用 Base64 编码

  • SHA1-Digest-Manifest:对整个 MANIFEST.MF 文件做 SHA1(或者 SHA256)后再用 Base64 编码

  • SHA1-Digest:对 MANIFEST.MF 的各个条目做 SHA1(或者 SHA256)后再用 Base64 编码

CERT.RSA

这里会把之前生成的 CERT.SF 文件,用私钥计算出签名, 然后将签名以及包含公钥信息的数字证书一同写入 CERT.RSA 中保存。这里要注意的是,Android APK 中的 CERT.RSA 证书是自签名的,并不需要这个证书是第三方权威机构发布或者认证的,用户可以在本地机器自行生成这个自签名证书。Android 目前不对应用证书进行 CA 认证。


综上所述,一个APK完整的签名过程

2.3 签名校验过程

签名验证是发生在APK的安装过程中,一共分为三步:

  1. 检查 APK 中包含的所有文件,对应的摘要值与 MANIFEST.MF 文件中记录的值一致。

  2. 使用证书文件(RSA 文件)检验签名文件(SF 文件)没有被修改过。

  3. 使用签名文件(SF 文件)检验 MF 文件没有被修改过。

综上所述,一个完整的签名验证过程如下所示:


APK V1 和 V2签名的区别

v1 签名有两个地方可以改进:

  • 签名校验速度慢

校验过程中需要对apk中所有文件进行摘要计算,在 APK 资源很多、性能较差的机器上签名校验会花费较长时间,导致安装速度慢。

  • 完整性保障不够

META-INF 目录用来存放签名,自然此目录本身是不计入签名校验过程的,可以随意在这个目录中添加文件,比如一些快速批量打包方案就选择在这个目录中添加渠道文件。

从 Android 7.0 开始,Android 支持了一套全新的 V2 签名机制

签名将验证归档中的所有字节,而不是单个 ZIP 条目。

简单来说,v2 签名模式在原先 APK 块中增加了一个新的块(签名块),新的块存储了签名,摘要,签名算法,证书链,额外属性等信息

优点: 1、速度快  2、完整性保证提高。

7.0之前 V1签名

7.0之后 v1 V2签名 ,先签V1  后签V2

Android 签名机制原理解析和V1 、V2签名区别相关推荐

  1. android Handler机制原理解析(一篇就够,包你形象而深刻)

    首先,我将Handler相关的原理机制形象的描述为以下情景: Handler:快递员(属于某个快递公司的职员) Message:包裹(可以放置很多东西的箱子) MessageQueue:快递分拣中心( ...

  2. 一篇文章看明白 Android v1 v2 签名机制

    Android - v1 & v2 签名机制 相关系列 一篇文章看明白 Android 系统启动时都干了什么 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制 一篇文章看明 ...

  3. Android安卓签名打包原理,步骤详细讲解(debug,release区别.V1,V2区别)

    所有的Android应用程序都要求开发人员用一个证书进行数字签名,Android系统不会安装没有进行签名的应用程序. 在应用程序开发期间,由于是以Debug调试模式编译的,因此IDE(ADT)根据会自 ...

  4. Android 插件化原理解析——Hook机制之AMSPMS

    在前面的文章中我们介绍了DroidPlugin的Hook机制,也就是代理方式和Binder Hook:插件框架通过AOP实现了插件使用和开发的透明性.在讲述DroidPlugin如何实现四大组件的插件 ...

  5. Android 插件化原理解析——Activity生命周期管理

    之前的 Android插件化原理解析 系列文章揭开了Hook机制的神秘面纱,现在我们手握倚天屠龙,那么如何通过这种技术完成插件化方案呢?具体来说,插件中的Activity,Service等组件如何在A ...

  6. Android 广播实现原理解析

    Android 广播实现原理解析 前言 Android四大组件中的BroadcastReceiver,在我们实际工作中被频繁的使用,我们可以利用系统的开机广播,网络状态改变的广播等等实现我们的业务逻辑 ...

  7. AsyncTask机制原理解析

    AsyncTask机制原理解析 Android为我们提供了2种方便的异步处理方案,Handler和AsyncTask,两种方式适合的场景网上一搜就知道了,但是为什么呢?这篇分析将为你揭晓答案.前面分析 ...

  8. Handler机制原理解析(二)prepare,loop,post

    Handler机制原理解析(二)prepare,loop,post 上一篇已经介绍了Handler机制的原理,如果不熟悉可以看Handler机制原理解析(一).这一篇,介绍下Handler周边的知识点 ...

  9. Handler机制原理解析(一)

    Handler机制原理解析(一) 我们都知道,在Android中,主线程也叫UI线程是负责界面更新的,子线程或者工作线程适合做网络请求,数据库等耗时操作.如果在主线程中执行耗时操作可能引发ANR异常. ...

最新文章

  1. 直播 | NeurIPS 2021:基于投影变换建模传递关系的知识图谱表示学习
  2. 创建文件并设置NTFS权限
  3. hbuilder版本更新失败_初试vue-cli使用HBuilderx打包app的坑
  4. 大话数据结构04:循环链表
  5. 三招让你成为vue.js大师
  6. sklearn 决策树例子_决策树--规则挖掘应用
  7. 服务容错保护断路器Hystrix之四:断路器监控(Hystrix Dashboard)-turbine集群监控
  8. session作用域_看完这篇Bean的作用域与生命周期,问到面试官不敢问-乐字节java...
  9. swift 异常捕获try catch的使用
  10. 李扬:2018春节港澳游(上篇:行)
  11. linux 格式化 lvm2,fedora 23 lvm2格式 根目录磁盘空间不足 扩容方法
  12. 弘辽科技:电商壹周大事
  13. win7计算机时间显示错误,Win7每次重新启动时计算机显示时间都是错误的
  14. 前端激荡三十年(一本最详细的编年史册)
  15. 安装docker环境报错:Could not resolve host
  16. Word打印目录或另存为PDF时出现“错误!未定义书签!”的解决办法
  17. 程序员转行适合做什么?
  18. Springboot企业资源管理信息系统kvonv计算机毕业设计-课程设计-期末作业-毕设程序代做
  19. 几款主流快速开发平台比较
  20. 图论欧拉回路初步 BZOJ2095 POI2010 Bridges

热门文章

  1. Java语言的特点及应用有哪些
  2. jenkins之插件下载方法
  3. html网页logo属性link,html元素link标签rel=icon添加网站favicon.ico图标
  4. VirtualBox-7.0.6 下载与安装
  5. 学习率衰减之余弦退火(CosineAnnealing)
  6. 我们上语文英语音乐计算机和美术英语,语文、英语、数学、是什么意思
  7. 工作中遇到的一些问题及解决办法
  8. 微信小程序上传文件报错: errMsg: “uploadFile:fail createUploadTask:fail invalid url“
  9. 微信小程序之添加文章功能
  10. MATLAB设计FIR数字滤波器GUI界面