iOS App的签名原理

2019-05-30  本文已影响0人  galenu

概念

目的


非对称加密


数字签名

签名.png
  • 首先用一种算法,算出原始数据的摘要。需满足:
    a.若原始数据有任何变化,计算出来的摘要值都会变化
    b.摘要要够短。这里最常用的算法是MD5
  • 生成一份非对称加密的公钥和私钥,私钥我自己拿着,公钥公布出去。
  • 对一份数据,算出摘要后,用私钥加密这个摘要,得到一份加密后的数据,称为原始数据的签名。把它跟
    原始数据一起发送给用户。
  • 用户收到数据和签名后,用公钥解密得到摘要。同时用户用同样的算法计算原始数据的摘要,对比这里计
    算出来的摘要和用公钥解密签名得到的摘要是否相等,若相等则表示这份数据中途没有被篡改过,因为如
    果篡改过,摘要会变化。

最简单的签名(AppStore)

image.png

但实际上因为除了从 AppStore 下载,我们还可以有三种方式安装一个 App:

  1. 开发 App 时可以直接把开发中的应用安装进手机进行调试。
  2. In-House 企业内部分发,可以直接安装企业证书签名后的 APP。
  3. AD-Hoc 相当于企业分发的限制版,限制安装设备数量。

新的需求

  1. 安装包不需要传到苹果服务器,可以直接安装到手机上。如果你编译一个APP到手 机前要先传到苹果服务器签名,这显然是不能接受的。
  2. 苹果必须对这里的安装有控制权,包括:
    • a. 经过苹果允许才可以这样安装。
    • b. 不能被滥用导致非开发app也能被安装。
      为了实现这些需求,iOS 签名的复杂度也就开始增加了

双层签名方案

image.png
  1. 在你的 Mac 开发机器生成一对公私钥,这里称为公钥L,私钥L。L:Local
  2. 苹果自己有固定的一对公私钥,跟上面 AppStore 例子一样,私钥在苹果后台, 公钥在每个 iOS 设备上。这里称为公钥A,私钥A。A:Apple
  3. 把公钥 L 传到苹果后台,用苹果后台里的私钥 A 去签名公钥 L。得到一份数据 包含了公钥 L 以及其签名,把这份数据称为证书。
  4. 在开发时,编译完一个 APP 后,用本地的私钥 L 对这个 APP 进行签名,同时 把第三步得到的证书一起打包进 APP 里,安装到手机上。
  5. 在安装时,iOS 系统取得证书,通过系统内置的公钥 A,去验证证书的数字签名 是否正确。
  6. 验证证书后确保了公钥 L 是苹果认证过的,再用公钥 L 去验证 APP 的签名, 这里就间接验证了这个 APP 安装行为是否经过苹果官方允许。(这里只验证安装 行为,不验证APP 是否被改动,因为开发阶段 APP 内容总是不断变化的,苹果不 需要管。)

避免滥用

image.png

最终方案

image.png

一些疑问

文章转载自传送门

上一篇 下一篇

猜你喜欢

热点阅读