哈喽朋友们,今天来跟你讲讲关于 iOS 签名相关的东西,这个在面试中可是会被问到,其实了解了 iOS 的签名机制,你就能理解平时开发时碰到的很多东西,比如 Provisioning Profile,比如 Apple 是如何控制安装到 iOS 上的 App 的。
iPhone 上所有的 App 都需要经过签名,当然不是签程序员的名,也不是签公司的名,签的是 Apple 官方的名,签了这名,就代表这个 App 是 Apple 官方认可的,没有病毒的,用户可以放心地安装和运行这个 App。
那你可能会说,我不在乎这个 App 有没有病毒,或者是不是盗版,我就想运行个没签名的 App ,不行吗?
—— 还真不行,Apple 说:那您还是用 Android 吧
这就是为什么 iPhone 和 iPad 只能安装 App Store 上的应用,普通用户哭爷爷告奶奶你也安装不了盗版的 App。
是怎么签的呢?
非对称加密+摘要算法。
假设我现在有一份数据 A 需要进行签名,首先我要对 A 使用「摘要算法」,得到一份「摘要」。
摘要,一种生活中的例子是藏头诗,比如对柳宗元《江雪》提取出它每句的第一个字(摘要算法),就得到「千万孤独」,这个就是这首诗的「摘要」。MD5 就是一种摘要算法。
为什么要提取「摘要」?—— 因为非对称加密的成本高,如果直接对《江雪》加密划不来。对摘要进行非对称加密就很便宜。
然后我用私钥对这份摘要进行「非对称加密」,就得到了「数字签名」。最后我把数据 A+数字签名打包,发送出去。(同时,把公钥公开)
你收到了我的数据A+签名,你怎么知道没有被其他人修改过呢?
你用公钥对「数字签名」进行非对称解密,得到了一份「摘要」 B1,然后又对数据使用相同的「摘要算法」,得到一份摘要B2,如果 B1=B2,那就说明数据没有被人改过。
如果有人破坏了我发送出去的「数据」或者「数字签名」,那最后得到的 B1 肯定不等于 B2,这就保证了数据的安全。
Apple 是这样签的吗?
是,但不完全是。
上面说的这个只是解释了从 App Store 上安装的情况。开发领域还有三种可以安装 App 到 iPhone 的方法:
开发者安装项目到手机上
企业内部的 iOS 应用安装(不上 App Store,比如我们公司iOS 版的 D-Chat)
内部测试 iOS 应用安装(也不上 App Store,但是需要先把设备信息注册上去)
上面说的简单方法不能满足 Apple 、企业和开发者的需求。iOS 签名机制复杂的部分来了:
开发者如何在本地编译项目,把 App 安装到手机上?
即便是开发阶段,Apple 此时也要求对应用的安装拥有控制权,但是又不可能要求开发者这个时候就把代码上传到 Apple 的服务器,开发者这会儿还没开发完呢。
注意,这里 Apple 只需要「安装」的控制权,而不需要管这个安装包是不是被人篡改过(肯定是不断被篡改的,因为还没开发完呢)
那这时就需要用到「双层签名」+ Provisioning Profile,具体是:
我在自己 Mac 电脑上生成了公钥 L 和私钥 L(L 表示Local 的、本地的)
同时。Apple 官方有自己的公钥 A 和私钥 A(A 代表 Apple)
我先把自己的公钥 L ,上传给 Apple 验证,验证通过后 Apple 会用私钥 A签名,生成一份证书(公钥 L + Apple 签名)
我在 Apple 的网站上申请 AppleID,配置好设备 ID(在哪个设备上安装,就配置哪个设备的 ID),App 可以使用的权限(对,这个也是被 Apple 控制的)。Apple 就会把这些信息,以及第 3 步提到的证书打包,用私钥 A再签个名,就生成了Provisioning Profile,
我把 Provisioning Profile 下载下来,在开发时,用自己电脑上的的私钥 L 对 App 进行签名,同时把Provisioning Profile也打包进 App 中,文件名是embedded.mobileprovision,然后把 App安装到手机上
安装时,iOS 系统用内置的公钥 A对 App 中的embedded.mobileprovision进行验证(证书也会验一遍),通过后就会取出Provisioning Profile中的信息。
好,这时候你的 iPhone 知道了:这次的安装是经过 Apple 官方许可的+一些配置信息
至此,顺利安装。
讲完啦,另外两种安装方式的过程差不多的,只是证书或者Provisioning Profile存在一点差异。
欢迎你转发、评论和点赞三连啊我的朋友!