苹果应用签名原理

361 阅读6分钟

公钥和私钥

  • 加密:公钥加密,私钥解密
  • 签名:私钥加密,公钥解密

公私钥是一对,谁都可以加密和解密,具体看使用场景 加密就是不希望别人要知道我的消息,只有我知道,消息可以被篡改,但是无法被他人获得。 签名就是不希望有人冒充我发消息,只有我能发布,公钥用来验证私钥所有者的身份,可以防止内容被篡改,但是无法保证不被他人获得

比如加密情景: 如果甲想给乙发一个安全的保密的数据,那么应该甲乙各自有一个私钥,甲先用乙的公钥加密这段数据,再用自己的私钥加密这段加密后的数据.最后再发给乙,这样确保了内容即不会被读取,也不会被篡改.

代码签名

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

数字签名: 使用非对称加密,保护数据的完整性和追踪消息的来源。
步骤:
  1.发送方生成非对称加密的公私钥,并公布其公钥和算法
  2.对消息进行hash.生成摘要,并用私钥对其进行加密
  3.接收方使用公钥和算法解密出的摘要和计算出的摘要如果一致,则证明消息来源准确并且没有被篡改
  
  安全前提:
  * 算法安全,私钥未泄露
  * 接收方查询的公钥和算法准确(数字证书与PKI体系的由来,如何管理和分发公钥)

简单的应用签名

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

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

双层签名

需求

简单的应用签名并不满足苹果的需求 那么我们来分析一下,它有些什么需求:

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

步骤

首先双层签名依赖俩个系统:Mac系统iOS系统

双层签名的步骤

  1. 在Mac系统中会生成一对公私钥,这里Xcode会帮我们生成。这里称为公钥M和私钥M
  2. 苹果也有自己的一对公私钥,跟之前的Appstore原理一样,私钥在Appstore,公钥在iOS系统中。这里称为公钥A和私钥A
  3. 把公钥M以及开发者信息发给苹果后台(就是CSR文件),苹果用私钥A签名公钥M得到一份数据包含公钥M和其签名,把这份文件称为证书
  4. 在开发时,在编译完一个App后,用本地的私钥M(今后你导出的p12)对这个app进行签名,并且把第三步得到的App一起打进这个App里,安装到手机上
  5. 安装时,iOS系统获取到证书,通过系统内置的公钥A,去验证证书的数字签名是否正确
  6. 验证证书后,确认公钥M经过苹果认证的。再用公钥M去验证app的签名,间接证明这个app安装行为是否得到苹果的允许(这里只验证安装行为,不验证app是否被改动,因为开发阶段app是不断变化的,苹果不需要管)

有了上面的过程,已经可以保证开发者的认证,和程序的安全性了。 但是,你要知道iOS的程序,主要渠道是要通过APP Store才能分发到用户设备的,如果只有上述的过程,那岂不是只要申请了一个证书,就可以安装到所有iOS设备了?这里就涉及到描述文件

描述文件

描述文件: 一般包含AppID, 设备,证书等,苹果为了解决滥用问题又加了俩个限制。

  • 需要在苹果后台注册过的设备才能安装

  • 限制签名,只针对某一个具体的app

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

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

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