前言
了解iOS的签名机制之前我们需要掌握以下几个知识:
加密算法(对称加密, 非对称加密)
单向散列函数
数字签名
证书
一、加密算法
1、对称加密
对称加密就是: 加密和解密用的密钥是同一个, 常用的加密算法有 :DES 、 3DES 、AES (注:DES 3DES 已不再安全)
- 优点: 加密、解密速度快
- 缺点: 不安全, 存在密钥配送问题
假设,A 将使用对称密码加密过的消息发给了B,只有将密钥发送给B,B才能完成解密,在发送密钥过程中,可能会被中间人窃取密钥,最后中间人也能完成解密。
2、非对称加密(RSA算法)
非对称加密: 有一对密钥, 成对生成, 分为公钥和私钥. 通过公钥加密的数据, 通过私钥才可以解开.通过私钥加密的数据, 通过公钥才可以解开.
- 缺点: 加密解密耗时, 速度慢
- 优点: 安全, 对信息保密,防止中间人截获
假设,A想发送消息给B, B只需要生成一对公钥和私钥, 私钥自己保留, 公钥是公开的,A只需要拿到B的公钥对消息进行加密, 发送给B即可, 所以传输过程中无法被中间人截获解密
3、混合密码系统
由于对称和非对称加密都存在各自的缺点, 混合密码系统应运而生
- 加密解密用: 对称加密 速度快
- 秘钥配送用: 非对称加密 安全
假设,A想发送消息给B, A生成一个用于对称加密的 密钥 , B用 RSA算法 生成一对公钥和私钥, 私钥自己保留, 公钥是公开的, A首先要用B的公钥对自己生成的秘钥进行加密发送给B, B就拿到了 密钥 , 之后A发消息都用此 密钥 对消息进行加密,B用拿到的 对称密钥 解密即可
总结: 密钥传输用 非对称加密(安全), 消息传输用 对称加密 (速度快)
二、单向散列函数(又称摘要)
单向散列函数
是指对不同的输入值,通过单向散列函数进行计算,得到固定长度的输出值。这个输入值称为消息 message,输出值称为散列值 hash value
单向散列函数的特点:
1、根据任意长度的信息计算固定长度的散列值
2、快速计算散列值
3、信息不同计算出的散列值不同
4、具备单向性(也就是通过散列值不能反算出消息来)
常见的单向散列函数有:
MD4,MD5 为128bit (不安全了)
SHA-1 为160bit(20字节)(不安全了)
SHA-2 (SHA-256,SHA-384,SHA-512)
SHA-3 全新标准
三、数字签名
数字签名主要是为了验证数据没有被篡改过.
为了更好的理解, 我们模拟一遍, 数字签名的实现
- A要向B发送消息时, A-→B, 如果有中间人把消息改改, AB都不会察觉到, 这时就用到了数字签名.
- 但是怎么做呢, 肯定需要对比消息是否一致,为了安全只能用非对称加密
1、A生成一对 公钥和私钥, 私钥 自己保留 公钥 发送给B
2、A用私钥对 消息 进行加密生成 签名 ,把[ 消息,签名 ]一起发送给B
3、B收到[ 消息, 签名 ],用 公钥 对 签名 进行解密和收到的 消息 进行对比,来确认数据没有被篡改
以上过程存一个问题:
- 签名速度太慢: 消息由于通过非对称加密生成的签名, 有时候消息很大, 速度很慢, 这里就用到了单向散列函数
我们可以对 签名的生成 进行改进
1. A生成一对 公钥和私钥 , 私钥 自己保留 公钥 发送给B
2. A首先对消息用单向散列函数生成一个散列值,用私钥对 散列值 进行加密生成 签名 ,把[ 消息, 签名 ]一起发送给B
3. B收到[ 消息, 签名 ], 用 公钥 对 签名 进行解密得到 散列值1 ,同时用相同的单向散列函数对消息生成 散列值2 ,通过两个散列值的对比,来确认数据没有被篡改
四、证书(Certificate)
证书 也叫 公钥证书 ,主要是为了解决配送发送问题.主要由认证机构 (Certificate Authority) 施加数字签名.
CA 就是能够认定 公钥确实属于此人 并能够用生成数字签名的组织或者个人.
流程大概如下:
- A生成一对`公钥和私钥`,A在认证机构CA注册自己的公钥,认证机构用自己的私钥对A的公钥进行数字签名,`[A的公钥,数字签名]`既为证书.
- B去认证机构下载A注册的公钥证书`[A的公钥,数字签名]`,B使用认证机构的公钥验证证书的签名,验证成功说明A的公钥的确是A生成的,这样就得到了A的公钥.
五、iOS签名机制
1、certSigningRequest文件
我们创建证书时,苹果会让我们提供一个. certSigningRequest 文件,其实这个文件就包含我们Mac电脑的公钥如下图:
上面文件创建步骤如下图,这个操作就是在我们电脑生成一对 公钥和私钥 ,私钥保存在我们的电脑,公钥生成 . certSigningRequest 文件.
. certSigningRequest 文件记录了开发者的个人信息、公钥、加密算法以及 单向散列函数等内容
可以使用以下命令来查看文件内容:
1 |
|
内容如下:
2、 .cer 和 .p12 文件
苹果得到我们的Mac公钥之后, 用苹果的私钥对我们的公钥进行签名, 生成开发或者发布证书
.cer文件内容包含开发者账号信息、Mac公钥以及相应的签名
我们可以使用以下命令来查看文件内容:
1 |
|
.p12文件(我们通过钥匙串导出的文件) p12文件 = `.cer文件` + `Mac私钥`
这就是为什么只有生成 `.certSigningRequest`文件的电脑可以打包, 如果其他电脑想打包的话, 必须由生成 `.certSigningRequest`文件的电脑导出p12文件方式来添加证书才可以
3、.mobileprovision 文件(描述文件)
苹果会对(开发, 发布, 推送等)证书进行二次签名, [Mac公钥, 签名] +[devices appid, entitlements],用苹果的私钥进行签名生成一个文件, .mobileprovision 也就是我们平时所说的描述文件.
Entitlements决定了哪些系统资源在什么情况下允许被使用。简单的说他就是一个沙盒的配置列表(plist 文件格式)
为什么需要 .mobileprovision 文件
仅有数字证书是不够的,为了防止权限被滥用,开发者还需要在苹果官网上注册用于开发的设备,仅有注册后的设备才被允许按照以上流程安装 app,官方限制最多100台. 除此之外,苹果还需要对 app 的权限进行控制,例如是否能够使用 iCloud、Wallet、Maps 等,苹果将这些功能授权统称为 Entitlements。开发者将上述权限配置完成后,需要从苹果后台下载并安装相应的 mobileprovision 文件
该文件包含:
证书、已注册的设备列表、AppId、功能授权列表、苹果的签名
如果有需要的话,你可以使用以下命令来查看.mobileprovision 文件内容
1 |
|
4、打包及安装流程
1、.mobileprovision 文件会放到Xcode指定目录下面, 当我们打包时, 首先编译生成 二进制数据包 ,然后用Mac私钥对其加密生成签名, 加上.mobileprovision文件生成我们的ipa包.
2、我们每个人的iPhone手机都内置了 苹果的公钥, 当App安装时,首先用苹果的公钥对 .mobileprovision文件 进行两次认证,得到 Mac的公钥 , 最后用Mac公钥验证第三个签名, 如果成功则安装程序.
六、流程图
1、非Appstroe下载 安装流程
2、Appstroe下载 安装流程
两种ipa安装包(.ipa和.zip互转)
- 我们通过Xcode Archive生成(常见的企业包)
- 在Appstroe下载
区别: 我们自己生成的ipa里面比在Appstroe下载的多一个 .mobileprovision文件
原因: App提交Appstroe审核后,苹果会对我们的App重签名, 这次是用苹果的私钥对App进行重签名生成[ App,签名 ]