android digest 认证,探究 Android 签名机制和原理
背景
最近在调研一个测试工具的使用,在使用中发现被测试工具处理过的apk文件经安装后打开就会崩溃,分析崩溃日志后原因是签名不一致导致的。
说到Android中的签名,可能大家都知道签名的目的就是为了保护apk文件的安全,如果apk被恶意篡改后经过安装校验的时候,就会出现校验失败,导致安装包安装失败的情况。但如果更深去问一下Android签名机制和原理,是不是就被问住了?接下来的就让我们去探究Android签名机制和原理。
Android 签名机制和原理
Android系统在安装APK的时候,首先会检验APK的签名,如果发现签名文件不存在或者校验签名失败,则会拒绝安装,所以应用程序在发布之前一定要进行签名。给APK签名可以带来以下好处:
应用程序升级如果想无缝升级一个应用,Android系统要求应用程序的新版本与老版本具有相同的签名与包名。若包名相同而签名不同,系统会拒绝安装新版应用。
应用程序模块化Android系统可以允许同一个证书签名的多个应用程序在一个进程里运行,系统实际把他们作为一个单个的应用程序。此时就可以把我们的应用程序以模块的方式进行部署,而用户可以独立的升级其中的一个模块。
代码或数据共享Android提供了基于签名的权限机制,一个应用程序可以为另一个以相同证书签名的应用程序公开自己的功能与数据,同时其它具有不同签名的应用程序不可访问相应的功能与数据。
应用程序的可认定性签名信息中包含有开发者信息,在一定程度上可以防止应用被伪造。例如网易云加密对Android APK加壳保护中使用的“校验签名(防二次打包)”功能就是利用了这一点。
签名的目的:
1. 对发送者的身份认证:
由于开发商可能通过使用相同的package name来混淆替换已经安装的程序,以此保证签名不同的包不被替换。
2. 保证信息传输的完成性:
签名对于包中的每个文件进行处理,以此确保包中内容不被替换。
3. 防止交易中的抵赖发生,market对软件的要求。
签名原理:
简单来说总体分为以下几个步骤:
1. 对Apk中的每个文件做一次算法(数据摘要+Base64编码),保存到MAINFEST.MF
2. 对MAINFEST.MF整个文件做一次算法(数据摘要+B阿瑟64编码),存放到CERT.SF文件的头属性中,在对MAINFEST.MF文件中各个属性块做一次算法(数据摘要+Base64编码),存放到一个属性块中。
3. 对CERT.SF文件做签名,内容存档到CERT.RSA中
对一个APK文件签名之后,APK文件根目录下会增加META-INF目录,该目录下增加三个文件,分别是:MANIFEST.MF、CERT.SF和CERT.RSA,以下是具体的流程:
MANIFEST.MF
这是摘要文件,文件中保存了APK里面所有文件的SHA1校验值的BASE64编码,格式如下(一个文件对应一条记录)。如果改变了APK包中的文件,在apk安装校验时,改变后的文件摘要信息与 MANIFEST.MF 的检验信息不同,程序就不会安装成功。假如攻击者修改了程序的内容,又重新生成了新的摘要,就可以通过验证。
Name: AndroidMainfest.xmlSHA1-Digest: incCj47jcu56R8pKV8dLACZBKD8=Name: META-INF/android.arch.core_runtime.versionSHA1-Digest: BeF7ZGqBckDCBhhvlPj0xwl01dw=
CERT.SF
这是对摘要的签名文件,对前一步生成的MANIFEST.MF,使用SHA1-RSA算法,用开发者的私钥进行签名。在安装时只能使用公钥才能进行解密。解密之后,与未加密的MANIFEST.MF进行对比,如果相符,则表明内容没有被异常修改。如果在这一步,开发者修改了程序内容,并生成了新的摘要文件,但是攻击者没有开发者的私钥,所以不能生成正确的签名文件。系统在对程序进行验证的时候,用开发者公钥对不正确的签名文件进行解密,得到的结果和摘要文件对应不起来,导致不能通过检验,不能成功安装文件。文件格式如下:
Name: AndroidMainfest.xmlSHA1-Digest: SyFsd2VUpCg4nq8jSOB7dBwuMyI=Name: META-INF/android.arch.core_runtime.versionSHA1-Digest: OPQCkzMXJVPQryHeMowVNZmfRMw=
CERT.RSA
该文件中保存了公钥、所采用的加密算法等信息。
从上面的内容来看,Android系统就是根据这三个文件的内容对APK文件进行签名检验的。
android digest 认证,探究 Android 签名机制和原理相关推荐
- 【Android】多渠道打包与签名机制
[Android]多渠道打包与签名机制 多渠道打包 我们在发布APP时,往往需要生成多个渠道包,以上传到不同的应用市场. 而每个渠道包中,都可以包含各自的渠道信息,当APP和后台交互或进行数据上报时, ...
- android listview 缓存,探究Android ListView 的缓存机制
概述 ListView 是继承AbListView,AbListView是所有列表类控件的基类. ListView的数据加载 在ListView数据加载中最关键的一个函数就是makeAndAddVie ...
- android 身份认证技术,Android平台上基于人脸识别的身份认证系统的设计与实现
摘要: 随着移动互联网与人工智能技术的发展,基于个人特征的生物识别技术代替传统的身份验证方式已经是大势所趋.而人脸识别是生物识别技术的一个重要组成部分,拥有其他生物识别技术没有的独特优势.本文主要针对 ...
- android java json_探究Android系统中解析JSON数据的方式
前言喜欢在前言里讲一下自己的现状,或许能有共鸣的同学,更多的是留给自己一个纪念,几个月或者几年再回来看的时候还是会很有感慨.今天说说语言,json这种数据格式之前我做服务器端的时候天天接触,天真的以为 ...
- Android签名机制-签名过程详解
目录 一.前言 二.准备知识 1.数据摘要 2.签名文件和证书 3.jarsign和signapk工具 4.keystore文件和pk8,x509.pem文件的区别 5.手动的签名Apk包 三.分析A ...
- Android签名机制及PMS中校验签名
一.签名机制 众所周知,在Android系统中,应用想要安装到设备中,必须要有签名才行,及时是debug的时候,开发工具也会对要运行的应用自动签名,那么我们先来了解一下这个签名究竟是什么. 首先And ...
- Android签名机制及PMS中校验流程(雷惊风)
@Android签名机制及PMS中校验流程(雷惊风) 网上看到一篇比较好的关于Android签名的文章,但是文章链接不安全,不知道哪天会不会找不到了,而且需要关注才能查看完整版,所以在这里记录一下,原 ...
- Android签名机制介绍:生成keystore.签名.查看签名信息等方法
为什么80%的码农都做不了架构师?>>> Android独有的安全机制,除了权限机制外,另外一个就是签名机制了.签名机制主要用在以下两个主要场合起到其作用:升级App和权限检查 ...
- Android签名机制:生成keystore、签名、查看签名信息
2019独角兽企业重金招聘Python工程师标准>>> Android独有的安全机制,除了权限机制外,另外一个就是签名机制了.签名机制主要用在以下两个主要场合起到其作用:升级App和 ...
最新文章
- 计算机网络控制系统,计算机网络远程控制系统的应用研究(原稿)
- oracle dp命令的使用说明
- 【Android 高性能音频】AAudio 音频流 数据回调细节 ( 数据回调函数优先级 | 数据回调函数 | 采样率 | 采样数 | 缓冲区调整 | 线程不安全 )
- linux select read阻塞_linux下的IO模型详解
- 如何使用1Password,Authy和Privacy.com外包您的在线安全性
- ZZULIOJ 1060:逆序数字
- 内核引导参数IOMMU与INTEL_IOMMU有何不同?
- mysql kegg_阿里技术官甩出的768页MySQL优化笔记,火遍全网不是意外
- Chrome 35个开发者工具的小技巧
- vb 复制 剪贴板 html,VB把选中的内容复制到剪切板
- JavaSE 学习参考:枚举类型
- 3年!我收获了22条ICEM使用经验与网格划分错误分析
- mysql utf8 bom_UTF8的BOM
- 西安电子科技大学计算机系分数线,西安电子科技大学2017年分专业录取分数
- JavaWeb-过滤器Filter学习(三)实现用户的自动登录与IP黑名单过滤
- Bootstrap下拉单选框,下拉搜索多选框Bootstrap-select
- cs224w(图机器学习)2021冬季课程学习笔记15 Frequent Subgraph Mining with GNNs
- 此图片来自微信公众平台 未经允许不可引用
- 微信小程序 实现美团外卖 菜单分类,左右联动 效果
- Android11以上版本使用高德定位,定位成功,卫星数一直为0
热门文章
- Vue CLI 安装
- Flowable 数据库表结构 ACT_HI_COMMENT
- IDEA Cannot access alimaven (http://maven.aliyun.com/nexus/content/groups/public/)
- mysql union left join_Case:MySQL使用left join的时候or改写成union可以提高效率
- python语言是编译性语音_最强编程语言 Java 和最受欢迎之 Python 的巅峰对决
- 修改文件 华为交换机_华为交换机系统文件管理配置命令大全(二)
- python中idle怎么打开_为什么我的python脚本只打开IDLE?
- 多线程:三大不安全案例
- 东莞 小学计算机编程大赛,关于举办第二十一届东莞市中小学电脑制作活动的通知...
- linux 自定义vi dd,Vim常用命令及配置方案