安卓签名校验机制

news/2024/9/20 2:37:56/文章来源:https://www.cnblogs.com/Joooook/p/18415209

安卓签名校验机制

目录

  • 1 V1方案
    • 1.1 V1方案的安全性
  • 2 V2方案
    • 2.1 摘要计算过程
    • 2.2 防回滚绕过
  • 3 V3方案
  • 4 V4方案
  • 5 签名实践
    • 5.1 keytool生成密钥库
    • 5.2 jarsigner
    • 5.3 apksigner
  • 6 引用

安卓的签名校验机制共有三代。

9.0以上的系统会判断apk是否使用到V3版本的签名,如果有,那么按照V3版本签名校验方式进行校验校验成功直接安装,校验失败拒绝安装;如果apk不是使用V3签名,判断是不是使用V2,如果没有使用V2那么再判断是不是使用V1的签名。

1 V1方案

v1签名后会增加META-INF文件夹,其中会有如下三个文件:

  • MANIFEST.MF:储存apk中每一个文件的摘要。
  • *.SFMANIFEST.MF 文件的摘要信息以及 MANIFEST.MF 文件当中每个条目在用摘要算法计算得到的摘要信息。
  • *.RSA:包含*.SF的签名及签名的公钥证书

以小米万能遥控的包apk为例

META-INF文件夹

MANIFEST.MF储存了文件名及其SHA256摘要的base64编码

*.SFMANIFEST.MF多了MANIFEST.MF的摘要,并且对MANIFEST.MF中的每个模块都进行了摘要。

如何区别一个模块,查看文件的十六进制,一个模块是以0D0A0D0A结尾的,其实就是两次换行。

AndroidManifest.xml模块来验证

*.RSAPKCS#7格式的数据经过ASN.1 DER规则编码之后的二进制文件

使用以下命令行读取

openssl pkcs7 -inform DER -in <*.RSA文件路径> -text -noout -print_certs

1.1 V1方案的安全性

APK 包的完整性校验不够强。如果我们在 APK 签名后,对 APK 包中没有涉及到原始文件的数据块做改变,那么这层校验机制就会失效。

2 V2方案

APK 签名方案 v2 是一种全文件签名方案,该方案能够发现对 APK 受保护部分进行的所有更改

APK Signing Bolck 由这几个部分组成:

偏移 字节数 描述
@0 8 这个 Block 的长度(本字段的长度不计算在内)
@8 n 一组 ID-value
@-24 8 这个 Bolck 的长度(和第一个字段一样值)
@-16 16 魔数 "APK Sig Block 42"

具体结构如下

ID = 0x7109871a的键值对块就是保存V2签名信息的地方。开头示例如下

结尾处示例

美团团队通过自定义ID,可以用来生成渠道包https://tech.meituan.com/2017/01/13/android-apk-v2-signature-scheme.html

ID = 0x7109871a的键值对块中的Value储存的是v2签名信息。

其中可以保存了一份或者多份APK签名信息(多个签名者)。

Value的内容结果如下

具体如下

示例分析。红框部分为摘要,紫框部分为证书。

2.1 摘要计算过程

摘要计算只针对原始zip内容

  • 拆分块chunk

    将每个部分(即上面标注第1、3、4部分)拆分成多个大小为 1 MB大小的块chunk,最后一个块chunk可能小于1MB。之所以分块,是为了可以通过并行计算摘要以加快计算速度

  • 计算块chunk摘要

    0xa5 + chunk长度(字节数) + chunk内容 拼接起来用对应的摘要算法进行计算出每一块的摘要值;

  • 计算整体摘要

    0x5a + chunk数 + chunk摘要(按块在 APK 中的顺序)拼接起来用对应的摘要算法进行计算出整体的摘要值

2.2 防回滚绕过

为了防止攻击者删除apk中的v2方案从而绕过,带 v2 签名的 APK如果还带 V1 签名,其 META-INF/*.SF 文件的主要部分中必须包含 X-Android-APK-Signed 属性。

3 V3方案

APK 的 v3 签名存储为 ID 值对,ID 为 0xf05368c0。v3 方案的设计与v2 方案非常相似。它具有相同的通用格式,添加了有关支持的SDK版本和proof-of-rotation结构的信息。

简单来说APK v3就是为了Andorid9的APK 密钥轮替功能而出现的,就是在v2的基础上增加两个数据块来存储APK 密钥轮替(更新签名密钥)所需要的一些信息,所以可以看成是v2的升级。具体结构见官网说明即可。

4 V4方案

APK v4是为了ADB 增量 APK 安装出现的

增量更新是基于 BSDiff 这个差量更新算法,基于两个 apk 字节码的差异,在服务端生成 patch 包,然后客户端通过同样的算法,把已安装的 apk 与 patch 包结合生成更新后的apk进行安装,以此减小 app 版本升级时的下载时间,提高更新效率。

签名方式和v2v3有所不同。

5 签名实践

以下介绍jarsignerapksigner签名工具的使用。

  • jarsignerJDK提供的针对jar包签名的通用工具,位置在JDK/bin/jarsigner
  • apksigner是Google官方提供的针对Android apk签名及验证的专用工具,位置在Android SDK/build-tools/SDK版本/apksigner

但这两种工具的签名都要使用到密钥库文件,所以顺便介绍密钥库生成。

5.1 keytool生成密钥库

使用keytool生成密钥库

keytool -genkey -keyalg RSA -keystore (指定密钥库文件名) demo.keystore

填写信息即可生成,

这个条目名字也是要用到的

或者我们可以指定条目名字

keytool -genkey -keyalg RSA -keystore demo1.keystore -alias test

5.2 jarsigner

签名命令

jarsigner -keystore 密钥库名 xxx.apk 密钥别名

还有以下两个参数比较重要

  • -digestalg 摘要算法
  • -sigalg 签名算法

5.3 apksigner

apksigner sign --ks demo1.keystore --ks-key-alias test app-debug.apk

apksigner默认开启v1v2签名,可以用以下参数关闭。

  • --v1-signing-enabled false
  • --v2-signing-enabled false

6 引用

Android V2签名与校验原理分析-CSDN

签名校验机制.md-Github

AndroidV1,V2,V3签名原理详解-腾讯云开发者社区-腾讯云

Android apk之v1、v2、v3签名-知乎

Android V2签名与校验原理分析_v2 方案校验不通过-CSDN博客

Android中APK签名工具之jarsigner和apksigner详解-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/797594.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

胡鑫宇第一次作业

软件技术第一次作业作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/rjjc/作业的要求 发布一篇随笔,对自己进行简单介绍姓名 胡鑫宇学号 2022329301143班级 22电气工程及其自动化(2)一、个人介绍 1. 个人情况 大家好,我是电气工程及其自动化2班的胡鑫宇,来自河北邯…

安卓应用启动流程

安卓应用启动流程 目录1 冷启动热启动 2 zygote和SystemServer 3 应用启动流程简述(记得补充) 4 从点击图标到通知Zygote4.1 Launcher 4.2 Activity.java 4.3 Instrumentation.java 4.4 ActivityTaskManager.java 4.5 ActivityTaskManagerService.java 4.6 ActivityStarter.j…

痞子衡嵌入式:JLink命令行以及JFlash对于下载算法的作用地址范围认定QN

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是JLink命令行以及JFlash对于下载算法的作用地址范围认定。最近痞子衡在给一个 RT1170 客户定制一个 Infineon MirrorBit 类型 64MB Flash 的 SEGGER 下载算法,做完之后在 JFlash 下测试小数据下载没有问题,但…

安卓系统启动流程解析

安卓系统启动流程 目录1 init阶段1.1 FirstStage 1.2 SELinux Setup 1.3 SecondStage2 init.rc的配置 3 Zygote的启动3.1 app_process 3.2 Zygoteinit.java4 SystemServer 5 总结 6 引用光看分析文章还是不够的,还是要和实践结合。 1 init阶段 init 命令的入口是init/main.cpp…

安卓架构

安卓架构 目录1 Linux 内核层 2 硬件抽象层 HAL 3 Native C/C++ 库 && Android Runtime 4 Java Framework 层 5 System Apps 层1 Linux 内核层 Android 平台的基础是 Linux 内核。例如,ART 依靠 Linux 内核来执行底层功能。Linux 内核的安全机制为 Android 提供了相应…

陈柯烽的第一次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/rjjc这个作业的目标 建立一个属于自己的博客,介绍自己以及表达对课程的期望姓名-学号 陈柯烽-2022329301006软件技术基础第一次作业 一、自我介绍 1、基本信息我叫陈柯烽,来自浙江宁波,是自动化22级一班的学生,我…

chm 文件打开只显示目录,不显示内容

chm 文件打开只显示目录,不显示内容解决方法:解除锁定OK 了

【好用安全保密】不用插件,压缩js、html、css、code【一眼就会系列】【亲测有效】

​ 仅用离线版Notepad搞定。不用插件及辅助工具,有效保证了文件信息安全。 (一般发布版本都是无注释的-压缩文件和已编译文件。为了信息安全性,所有都是离线-区域网研发。) ​ 总结: 先把文本中注释去掉。 notepad++ 【编辑】-【空白字符操作】-【移除行首和行尾空格】 …

《密码系统设计》第二周

第二周预习报告 学习内容Head First C 嗨翻 C 语言 第8章 《Windows C/C++加密解密实战》第3,5章 第三章重点 3.4,3.5, 特别3.4.4 第五章重点 5.3.7 课程 mindmapAI 对学习内容的总结(1分) 要求让AI阅读学习内容并进行总结总结 1. Head First C 嗨翻 C 语言 第8章函数指针:…

活动召集丨实时多模态 AI Builder 团聚!RTE Open Day@S创上海,9.20/21

9 月 20~21 日,上海, S创上海 2024,看见不一样的创新和技术。这场年轻、多元、活力十足的科技盛会,将汇聚创业者、开发者、艺术家和众多无法定义边界的跨界者。RTE 开发者社区的 Builders 和 RTE Open Day 也将玩乐其中!「有一群人在一起,就很好」。 来到第四期的 RTE O…

问题1:pytorch版本不同,文件运行速度不同

好像新版本更快一点哦,为什么呢? 版本1: PyTorch version: 1.12.1Is CUDA available? TrueCUDA version: 11.3cuDNN version: 8302版本2: PyTorch version: 2.3.1+cu121Is CUDA available? TrueCUDA version: 12.1cuDNN version: 8907

踩坑日志2:dataloader的num_workers问题

当我想用dataloader多开子进程加快图片加载速度时,发现报有关进程的错误:RuntimeError: An attempt has been made to start a new process before thecurrent process has finished its bootstrapping phase.This probably means that you are not using fork to start your…