6、苹果签名原理

news2025/1/12 18:18:20

一、iOS应用签名原理

  • 代码签名
  • 双层代码签名
  • 描述文件

1.1 代码签名

  • 代码签名是对可执行文件或脚本进行数字签名,用来确认软件在签名后未被修改或损坏的措施. 和数字签名原理一样,只不过签名的数据是代码.

1.1.1 简单的代码签名

- 在iOS出来之前,以前的主流操作系统(Mac/Windows)软件随便从哪里下载都能运行,系统安全存在隐患,盗版软件,病毒入侵,静默安装等等.那么苹果希望解决这样的问题,要保证每一个安装到 iOS 上的 APP 都是经过苹果官方允许的,怎样保证呢?就是通过代码签名。

- 如果要实现验证.其实最简单的方式就是通过苹果官方生成非对称加密的一对公私钥.在iOS的系统中内置一个公钥,私钥由苹果后台保存,我们传APP到AppStore时,苹果后台用私钥对APP数据进行签名,iOS系统下载这个APP后,用公钥验证这个签名,若签名正确,这个APP肯定是由苹果后台认证的,并且没有被修改过,也就达到了苹果的需求:保证安装的每一个APP都是经过苹果官方允许的.

- 如果我们iOS设备安装APP只从App Store这一个入口这件事就简单解决了,没有任何复杂的东西,一个数字签名搞定.

- 但是实际上iOS安装APP还有其他渠道.比如对于我们开发者iOSER而言,我们是需要在开发APP时直接真机调试的.而且苹果还开放了企业内部分发的渠道,企业证书签名的APP也是需要顺利安装的. 苹果需要开放这些方式安装APP,这些需求就无法通过简单的代码签名来办到了。

1.1.2 苹果的需求

  • 安装包不需要上传到AppStore,可以直接安装到手机上
  • 苹果为了保证系统的安全性,又必须对安装的App有绝对的控制权
    • 经过苹果允许才可以安装.
    • 不能被滥用导致非开发App也能被安装.
  • 为了实现这些需求,iOS的签名复杂度也就开始增加了,苹果这里给出的方案是双层签名

1.2 双层代码签名

  • 为了实现苹果验证应用的一些需求,iOS签名的负责度增加,给出双层签名的方案

1.2.1 双层代码签名

- iOS的双层代码签名流程这里简单梳理一下,这也不是最终的iOS签名原理.iOS的最终签名在这个基础上还要稍微加点东西.

- 首先这里有个两个角色,一个是iOS系统,还有一个就是我们的Mac系统,因为 iOS的App开发环境在Mac系统下.所以这个依赖关系成为了苹果双层签名的基础.

    • 1. 在Mac系统中生成非对称加密算法的一对公钥、私钥(Xcode帮忙代办).这里称为公钥M 私钥M. M = Mac
    • 2. 苹果有自己固定的一对公私钥,跟之前AppStore原理一样,私钥在苹果后台,公钥在每个iOS系统中,这里称为公钥A, 私钥A. A=Apple
    • 3. 把公钥M以及一些开发者的信息,传到苹果后台(这个就是CSR文件), 用苹果后台的私钥A去签名公钥M. 得到一份数据:包含了公钥M以其签名,把这份数据称为证书.
    • 4.开发时,编译完一个App后,用本地的私钥M(今后你导出的P12), 对这个App进行签名,同时把第三步得到的证书一起打包进App里.安装到手机上.
    • 5.在安装时,iOS系统取得证书,通过系统内置的公钥A, 去验证证书的数字签名是否正确.
    • 6.验证证书后确保了私钥M是苹果认证过的, 再用公钥M去验证App的签名,这里就间接验证了这个App安装行为是否经过苹果官方允许.(这里只是验证安装行为,不验证App是否被改动,因为开发阶段App内容总是不断变化的,苹果不需要管)
  • 有了上面的数据,已经可以保证开发者的认证,和程序的安全性了.但是,你要知道iOS的程序中,主要渠道是要通过AppStore才能分发到用户设备的,如果只有上述的过程,那岂不是只要申请了一个证书,就可以安装到所有iOS设备了?

1.3 描述文件

- 描述文件(Provisioning Profile)一般包括三样东西: 证书、AppID、设备.当我们在真机运行或者打包一个项目的时候,证书用来证明我们程序的安全性和合法性.

- 苹果为了解决应用滥用的问题,所以又加了两个限制.

        - 第一个限制在苹果后台注册过的设备才可以安装

        - 第二个限制签名只能针对某一个具体的App

- 并且苹果还想控制App里面的iCloud/Push/后台运行/调试器附加这些权限,所以苹果把这些权限开关统一称为Entitlements(授权文件),并将这个文件放在了一个叫做Provisioning Profile(描述文件)文件中.

- 描述文件是在AppleDeveloper网站创建的(在Xcode中填上AppID它会代办创建),Xcode运行时会打包进入App内.所以我们使用CSR申请证书时,我们还要申请一个东西,就是描述文件.

- 在开发时,编译完一个App后,用本地的私钥M对这个App进行签名,同时把从苹果服务器得到的Provisioning Profile文件打包进App里,文件名为enbedded.mobileprovision, 把App安装到手机上,最后系统进行验证.

苹果签名原理

  • Mac电脑生成一对公钥和私钥
    • 利用本地公钥创建CSR文件,请求证书
    • 钥匙串将证书和本地私钥(P12证书)做关联
  • 苹果服务器利用本地私钥生成证书以及描述文件
    • 证书包含Mac电脑的公钥以及签名
    • 描述文件: 设备列表、APPID列表、权限
  • iOS系统利用系统的公钥(与苹果服务器的私钥是一对)对APP进行验证
    • 验证描述文件是否与证书匹配
    • 验证APP的安装行为(通过验证证书,拿出证书中的公钥对APP的签名进行验证)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自动控制原理模拟卷5

自动控制原理模拟题五 Question1 液位自动控制系统原理示意图如下图所示,在任意情况下,希望液面高度 c c c维持不变,说明系统工作原理并画出系统方块图。 解: 当电位器电刷位于中点位置时,电动机不动,控制阀门有一定的开度,使水箱中流入水量与流出水量相等,从而液面保…

C6678-缓存和内存

C6678-缓存和内存 全局内存映射扩展内存控制器(XMC)-MPAX内存保护与地址扩展使用例程缓存 全局内存映射 扩展内存控制器(XMC)-MPAX内存保护与地址扩展 每个C66x核心都具有相同大小的L1和L2缓存,并且可配置为普通内存使…

【微信小程序-原生开发】实用教程21 - 分包

分包的流程 当微信小程序主包大小超过2M时,则需要对微信小程序进行分包,方法如下: 1. 转移页面文件 在项目根目录下,新建文件夹 package1 (即自定义的分包名为 package1 )文件夹 package1 内新建文件夹 p…

C嘎嘎~~【初识C++ 中篇】

初识C 中篇 1.缺省参数2.函数重载2.1函数重载的概念2.2函数重载的原理 3.auto关键字3.1类型别名思考(typedef)3.2auto的简介3.3auto的使用规则3.4 auto不能推导的场景 4.基于范围的for循环4.1范围for的语法4.2范围for的使用条件 1.缺省参数 缺省参数是 声…

02_2440soc_内存地址映射和选择,寄存器地址的选择

大多数arm芯片从0开始启动 nand_flash控制器外接nand_flash 256M cpu直接接nor_flash 2M nor_flash启动时候 nor_flash上面烧了bin文件 nor_flash基地址为0 cpu直接读nor上的第一个指令(前4字节),执行 cpu继续读取其他指令 执行 如果使用nor启动,片内的sram的地址就是 0x4000…

实战:内存分配与回收策略

java技术体系的自动内存管理,最根本的目标是自动化地解决两个问题:自动给对象分配内存以及自动回收分配给对象的内存。 1 前置知识 1.1 Minor GC 与Full GC Minor GC: 新生代GC,是指发生新生代的垃圾收集动作。Minor GC非常频繁&#xff0…

mac m1安装stable-diffusion

安装stable-diffusion 安装Homebrew安装python及其他依赖下载model安装Stable-Diffusion-WebUI执行./webui.sh作图http://127.0.0.1:7860 安装Homebrew 查询是否安装 brew -v安装 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.…

14.网络爬虫—selenium详讲

网络爬虫—selenium详讲 一selenium简介Selenium 的优点 二安装模块三设置浏览器驱动确认版本:查找对应驱动下载驱动 四使用模块selenium选取元素方法selenium嵌套页面元素定位selenium网页下拉selenium下拉表选择selenium行为链selenium等待 五错误解决方案六结束语…

[oeasy]python0135_python_语义分析_ast_抽象语法树_abstract_syntax_tree

语义分析_抽象语法树_反汇编 回忆 上次回顾了一下历史 python 是如何从无到有的看到 Guido 长期的坚持和努力 python究竟是如何理解 print(“hello”)的?这些ascii字母如何被组织起来执行? 纯文本 首先编写Guido的简历 print("1982------Gui…

LeetCode刷题集(五)(LeetCode1.两数之和)

学习目标: 掌握LeetCode第一题两数之和 学习内容: LeetCode第一题两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会…

ASEMI代理AD9951YSVZ原装ADI车规级AD9951YSVZ

编辑:ll ASEMI代理AD9951YSVZ原装ADI车规级AD9951YSVZ 型号:AD9951YSVZ 品牌:ADI/亚德诺 封装:HTQFP-48 批号:2023 引脚数量:48 安装类型:表面贴装型 AD9951YSVZ汽车芯片 特征 400 MS…

shell编程实例 — 实现4G开机自动运行,实时监测,断线自动重拨》

shell编程实例 — 实现4G开机自动运行,实时监测,断线自动重拨》 往事只能回味味道 于 2021-11-20 02:30:53 发布831 收藏 1 分类专栏: shell 文章标签: ubuntu linux udp 版权 ​编辑shell专栏收录该内容 3 篇文章0 订阅 订阅…

Mysql日志系统-InnoDB引擎层

一、redo log日志 接下来的两个日志,是innodb为解决不同问题而引出的两类日志文件。 redo log(重做日志)的设计主要是为了防止因系统崩溃而导致的数据丢失,其实解决因系统崩溃导致数据丢失的思路如下: 1、每次提交事务…

SpringBoot解决用户重复提交订单(方式二:通过Redis实现)

文章目录 前言1、方案实践1.1、引入Redis依赖1.2、添加Redis环境配置1.3、编写获取请求唯一ID的接口,同时将唯一ID存入redis 1.4、编写服务验证逻辑,通过 aop 代理方式实现1.5、在相关的业务接口上,增加SubmitToken注解即可 2、小结 前言 在…

华润数科、京东科技、京彩未来携手共进,求解“科技×产业”最大值

4月18日,华润数科、京东科技、京彩未来三方代表在中国深圳签署三方合作协议。面向产业数字化的市场机遇,华润数科物联网事业部总经理刘楚明先生表示,华润数科作为华润集团重点培育的数字科技业务单元,基于技术优势及资源整合能力&…

在SAP中使用QUERY

在SAP中使用QUERY 一、SAP query介绍 ​ QUERY是SAP提供的方便无编程基础用户的报表工具,使用图形化的界面,让用户托托拽拽就能轻松完成报表编写。我们可以将Query理解成QuickView的高级版本,它在QuickView的基础上增加的功能有&#xff1a…

一、摄影基础课

目录 第一章 控制曝光1. 曝光及曝光三要素1.1 曝光1.2 光圈1.3 快门1.4 感光度(ISO)1.5 曝光三要素之间的关系 2. 曝光模式3. 测光模式4. 曝光补偿 第二章 控制对焦1. 对焦区域2. 对焦模式 第三章 控制色彩 第一章 控制曝光 1. 曝光及曝光三要素 1.1 曝…

尚硅谷大数据技术Zookeeper教程-笔记01【Zookeeper(入门、本地安装、集群操作)】

视频地址:【尚硅谷】大数据技术之Zookeeper 3.5.7版本教程_哔哩哔哩_bilibili 尚硅谷大数据技术Zookeeper教程-笔记01【Zookeeper(入门、本地安装、集群操作)】尚硅谷大数据技术Zookeeper教程-笔记02【服务器动态上下线监听案例、ZooKeeper分布式锁案例、企业面试真…

外包干了4年,直接废了···

有一说一,外包没有给很高的薪资,是真不能干呀! 先说一下自己的情况,大专生,19年通过校招进入湖南某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了&#xff0…

[java/初学者]java常用API(1)——包装类

前言 在学习本课题之前,我们首先需要知道什么是API。 API,即Application Programming Interface,中文名称是“应用程序接口", 这些接口就是"jdk所提供"给我们使用的类,我们不需要去深究它是如何实现…