iOS签名授权机制
几个重要的概念
1. 非对称加密
非对称加密算法需要两个密钥:公开密钥(publickey
)和私有密钥(privatekey)
。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。(私钥是要保密的,公钥可以公开)
RSA
是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。RSA
是以三个发明者的姓氏首字母组成的。
2. 摘要算法
数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密。数据摘要算法也被称为哈希(Hash)算法、散列算法。
摘要算法也可以理解为将任意长度的数据,通过一个算法,得到一个固定长度的数据。典型的摘要算法,比如大名鼎鼎的MD5
和SHA
。
3. 数字签名
数字签名就是利用非对称加密
和摘要算法
来传输数据,保证数据的完整性
和合法性
。验证过程如下:
1. 发送方使用给一个摘要算法(MD5
)得到要发送数据的摘要,然后用自己的私钥和一个非对称加密算法(RSA
)对得到的摘要加密,得到加密后的数据,然后将要发送的数据
、加密后的数据
、摘要算法
和加密算法
一同发送给接收方。
2. 接收方接收到数据后,根据指定的摘要算法(MD5
)得到实际要传输的数据的摘要,然后在根据指定的加密算法(RSA
)和已有的公钥解密得到加密数据解密后的数据,最后比较解密后的数据和得到的摘要是否相同,如果相同就说明实际要传输的数据是完成的合法的。
4. 数字证书
数字证书就是通过数字签名方式来传输的一段数据,iOS开发中的数字证书是Apple Worldwide Developer Relations Certification Authority(WWDR)证书认证中心数字签名过的数据,表面上我们看到的就是钥匙串中的证书,实际WWDR数字签名后的证书包含以下内容:
- 用户的公钥
- 用户信息
- 证书机构名称
- 证书有效期
- 苹果数字签名 : 用于验证以上信息
iOS签名验证流程
整个过程的前提是已经购买了苹果的开发者账号(\$99或\$299)。并且安装了Xcode
,因为安装Xcode
的过程中会自动安装苹果的开发者根证书(Apple Worldwide Developer Relations Certification Authority
)。这证书包含了苹果CA的公钥
。有了这个公钥,我们和Apple就可以进行互信的信息传递。整个过程大致如下:
一. 证书申请
用我们自己的机器生成
CertificateSigningRequest.certSigningRequest
文件,在生成的过程中会产生一对公钥和私钥,私钥已经保存在我们的机器上,这个文件包含了我们的公钥,具体内容如下:- 申请者信息,此信息是用申请者的
私钥
加密的。 - 申请者公钥,此信息是申请者使用的
私钥
对应的公钥。 - 摘要算法和公钥加密算法
- 申请者信息,此信息是用申请者的
上传
CertificateSigningRequest.certSigningRequest
到MemberCenter
。MemberCenter
根据获取到的公钥
和我们的用户信息,通过Apple
自己的私钥进行数字签名生成证书,这个证书可以通过安装Xcode
过程中安装的根证书进行验证。具体证书包含内容如下:- 用户的公钥
- 用户信息
- 证书机构名称
- 证书有效期
- 苹果数字签名 : 通过根证书验证以上信息
下载生成的证书,双击安装就会出现在
钥匙串
中,钥匙串
会根据证书中的公钥对应上本机器上的私钥。
二. 打包签名
在
MemberCenter
上生成mobileprovision
下载安装,mobileprovision
包含如下信息:- appid:每个
app
在MemberCenter
创建的对应的id
。 - 包含哪些证书:不同证书对应不同功能。
- 功能授权列表
- 可安装的设备列表:iOS设备的UDID列表,发布证书应该是通配。
- 苹果数字签名:苹果用来验证以上的信息。
- appid:每个
通过
Xcode
指定要使用的证书,其实是 指定了签名过程中要使用的私钥
,这个私钥是和证书中的公钥相对应的。然后指定对应的mobileprovision
,由于mobileprovision
文件中包含了证书,实际上本地证书就是Xcode
用来指定对应私钥
用的。- 最后通过指定的私钥对需要签名的数据进行数字签名(编译过程在签名之前,这里省略了编译过程,编译后的二进制文件也是要签名的内容),最终将
ipa
包的形式输出,ipa
的文件结构如下:
- 资源文件:例如图片、html、等等。
- _CodeSignature/CodeResources:plist文件,内容是包内所有数据的数字签名。
- 可执行文件:编译后的二进制文件。
- mobileprovision:我们之前通过Xcode指定的包含了证书的文件。
- Frameworks:程序引用的非系统自带的Frameworks。每个Framework的结构跟app其实差不多
三. 验证安装
- 解压
ipa
包,获取embedded.mobileprovision
,通过设备上的Apple
公钥验证该文件的完整性和安全性。 embedded.mobileprovision
文件验证通过,获取该文件内的用户证书,再通过设备上的Apple
公钥验证该证书的完整性和安全性。- 证书验证通过后,获取证书内的我们开发者的公钥。然后通过开发者的公钥验证应用程序包内的数据的完整性和安全性。通过后即可安装。