iOS App 签名的原理
本文只讨论真机调试安装
如果是 Windows 用户,肯定会对 iOS 软件下载&安装流程感觉很不适应,iOS 系统中没法随意安装 APP(越狱除外)。
可能是出于系统安全的考虑,苹果不希望随意安装第三方 App,iOS 设备都会在安装以前确定 App 是否“合法”,非法的 App 不允许安装。
签名正是为了帮助苹果去实现这一需求的手段
密送&签名
从非对称加密原理上来说,私钥和公钥都可以同时用来加密和解密,参考RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密?聊聊这个事情。
从设计上来说,私钥和公钥是一对多的关系。上图中每个圆圈代表了一个人,他们分别持有了私钥或者公钥(有且只有一把)
公钥加密私钥解密(密送)
只有私钥持有者可读,所有人可写。
当持有公钥的人尝试和持有私钥的人通讯,公钥加密保证了信息内容不会被除了私钥持有人以外的所有人获取。从私钥持有者的角度看,他能够看懂发送的内容
第三方因为无法解密,所以无法了解
私钥加密公钥解密(签名)
只有私钥可写,所有人可读
签名
通常用在解决内容被篡改
的问题。发送方通常会对包裹
计算一个摘要
。
接收方会可以依靠摘要
判断内容是否被篡改
##两组公私钥
在整个App签名到最后安装的过程中会涉及到两组公私钥,每组的用途不同,钥匙的分布如下
###开发者的秘钥对用来保障 App 不会被篡改
开发者在打包的过程中会创建相关资源(包括代码)的摘要,并且用开发者的私钥进行加密防止第三方修改。
注:图中的可执行文件还包含了资源文件
这里说的保证 App 内容不被篡改其实并不严谨,其他人依旧可以用自己的账号对 App 重新签名。
###苹果的秘钥对用来校验开发者权限
iOS 系统(公钥方)在安装的时候会验证证书,证明 APP 来源是合法的。
而验证的依据就是 Provisioning Profile
苹果对图中的所有内容都进行了签名,保证信息不会被篡改。
##开发者的公钥和私钥
一:开发者在本地利用 keychain 创建 CSR。
将会得到一对公私钥和一个 CSR 文件。
二:发送本地生成的CSR到苹果后台,得到了证书(CER)
三:在苹果开发者后台创建Provisioning Profiles
四:开发者用本地的私钥签名 App
五:开发者把Provisioning Profiles打包进 APP
第三方App重签名
了解了自己的 App 签名的过程,签名第三方 App 其实也没有什么问题。
- 首先从第三方渠道下载到对方的安装包。这里不能从 AppStore 下,因为苹果会用自己的私钥签名,我们没办法修改(这里其实我没有太研究,可能说得有问题)
- hook 修改相关代码
- 替换
CodeSignature
和embedded.mobileprovision
- 安装