0%

iOS App 签名原理

iOS App 签名的原理

本文只讨论真机调试安装

如果是 Windows 用户,肯定会对 iOS 软件下载&安装流程感觉很不适应,iOS 系统中没法随意安装 APP(越狱除外)。

可能是出于系统安全的考虑,苹果不希望随意安装第三方 App,iOS 设备都会在安装以前确定 App 是否“合法”,非法的 App 不允许安装。

签名正是为了帮助苹果去实现这一需求的手段

密送&签名

从非对称加密原理上来说,私钥和公钥都可以同时用来加密和解密,参考RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密?聊聊这个事情。

从设计上来说,私钥和公钥是一对多的关系。上图中每个圆圈代表了一个人,他们分别持有了私钥或者公钥(有且只有一把)

img

公钥加密私钥解密(密送)

只有私钥持有者可读,所有人可写

当持有公钥的人尝试和持有私钥的人通讯,公钥加密保证了信息内容不会被除了私钥持有人以外的所有人获取。从私钥持有者的角度看,他能够看懂发送的内容

img

第三方因为无法解密,所以无法了解

img

私钥加密公钥解密(签名)

只有私钥可写,所有人可读

签名通常用在解决内容被篡改的问题。发送方通常会对包裹计算一个摘要

img

接收方会可以依靠摘要判断内容是否被篡改

img

##两组公私钥

在整个App签名到最后安装的过程中会涉及到两组公私钥,每组的用途不同,钥匙的分布如下

img

###开发者的秘钥对用来保障 App 不会被篡改

开发者在打包的过程中会创建相关资源(包括代码)的摘要,并且用开发者的私钥进行加密防止第三方修改。

img

注:图中的可执行文件还包含了资源文件

这里说的保证 App 内容不被篡改其实并不严谨,其他人依旧可以用自己的账号对 App 重新签名。

###苹果的秘钥对用来校验开发者权限

iOS 系统(公钥方)在安装的时候会验证证书,证明 APP 来源是合法的。

而验证的依据就是 Provisioning Profile

img

苹果对图中的所有内容都进行了签名,保证信息不会被篡改。

##开发者的公钥和私钥

一:开发者在本地利用 keychain 创建 CSR。

img

img

将会得到一对公私钥和一个 CSR 文件。

二:发送本地生成的CSR到苹果后台,得到了证书(CER)

img

三:在苹果开发者后台创建Provisioning Profiles

四:开发者用本地的私钥签名 App

五:开发者把Provisioning Profiles打包进 APP

第三方App重签名

了解了自己的 App 签名的过程,签名第三方 App 其实也没有什么问题。

  1. 首先从第三方渠道下载到对方的安装包。这里不能从 AppStore 下,因为苹果会用自己的私钥签名,我们没办法修改(这里其实我没有太研究,可能说得有问题)
  2. hook 修改相关代码
  3. 替换 CodeSignatureembedded.mobileprovision
  4. 安装