苹果为什么要实现双层代码签名?如何实现?
软件下载途径的不可控,也就导致app的质量不可控,可能存在病毒软件、不健康软件,苹果为解决这个问题,对iOS上所有的软件下载,都需要先得到苹果官方的认证,为此出现了App Store这个由苹果提供的下载平台。
1、理想状态下,所有的app都是在App Store上下载的:
iOS手机和苹果服务器分别拥有着公钥、私钥,开发人员把app提交到苹果商店,苹果用私钥对app内容进行签名,然后iOS手机去App Store下载这个应用,并用手机自带的公钥验证签名的有效性,验证通过就可以判定这个app没有被修改过,是得到苹果认证的,是可用的。如此一来就可以实现苹果最初的设想。
2、但实际上,我们的app除了App Store这个下载途径,还有在测试阶段安装到手机上这个情况。
为解决以上问题,苹果设计了双层代码签名。具体如何设计的,请各位看官听我娓娓道来~
1、Mac电脑上生成一对公钥M、私钥M,Xcode已经帮我们做了这个事情
2、Mac电脑从钥匙串生成一个csr请求文件,将这个csr丢给苹果服务器
3、苹果服务器和iOS手机分别拥有着私钥A(苹果)、公钥A(手机)
4、苹果服务器用私钥A对csr里的公钥M进行签名,返回一个证书
5、Mac电脑用私钥M对编译后的app进行签名,并和授权文件一起打包到app里
6、iOS手机安装app的时候,用手机自带公钥A对授权文件里的证书进行有效性验证,验证通过则拿出公钥M
7、用公钥M对app签名进行解密,得到代码的hash值E,对代码进行hash值转化得到hash值F,将E和F进行对比,如果一致则说明app签名是有效的。
补充信息如下:
第6步,对证书的有效性验证具体操作如下:
用手机自带公钥A对授权文件的证书里的加密hash值进行解密,得到公钥M的hash值C,对证书里的公钥M进行hash值转化得到hash值D,将C和D两个hash值进行对比,如果一致则说明公钥是未被改变的,可用。
签名:
意思是将原始数据的hash值进行非对称加密(RSA),加密结果和原文丢给接收者,接收者与发送者分别持有公钥和私钥,至于谁持有公钥这个不打紧,只要保证它俩的是一对。接收者可用对应的公钥或私钥对其进行解密得到真实的hash值,通过对接收的原文进行hash值转化,将它和真实hash值对比,如果一致,则能保证传输过程中原文内容未被修改。
证书包含:公钥M + 公钥M的hash值的非对称加密结果
授权文件:权限信息+证书
私钥M:后续钥匙串里证书导出来的.p12文件