手机和苹果服务器还有开发人员的MAC电脑,他们一共维护着2对公私钥,利用这两对公私钥分别完成双向签名与验证,从而已到达苹果服务器对苹果手机里的appstore的控制权,辨别此app是不是通过受权的。安全
Mac电脑做为开发者的电脑,本身有一组公私钥M,而后苹果服务器本身有一个私钥A,而后手机端保存了一份苹果服务器的公钥A。公钥加密的文件只有对应的私钥才能解开,反之私钥加密的文件只有对应的公钥才能解开。bash
这个文件很熟悉吧,这就是MAC端的公钥M,固然口说无凭,咱们能够打开看一下。服务器
openssl asn1parse -i -in CertificateSigningRequest.certSigningRequest
复制代码
结果以下:
注意这个红圈的位置,他指定了采用sha256 RSA加密方式。 这就是你与苹果服务器之间的加密方式。app
苹果拿到公钥M以后,会采用本身的私钥A对你的公钥M和CSR文件里面的hash值进行加密而后发送给你,这个就是你申请到的开发者证书。
iphone
生成应用的时候,Mac用本身的私钥M对咱们的App进行了一次签名,而后将真正的可执行文件Macho+App的签名+苹果下发的证书共同打包生成了咱们的app包,这个就是安装在手机的上的文件。
固然口说无凭,咱们能够对app包打开看一下编码
这里三个划红线的地方分别就是咱们的APP签名信息、Macho能够行文件、证书。加密
咱们的iphone利用本身的公钥A,解开苹果服务器私钥A签名的证书,获取到里面的公钥M。spa
利用获得的公钥M继续解开Mac电脑私钥M的App签名,从而验证APP是否有效。
这就是苹果的APP的双向签名原理。3d
有了上面那个流程后,看似安全了,但是他真的完美了吗?其实仍是有一个缺陷的,开发者彻底能够拿到证书后直接给手机安装上,这样作不是就绕开Appstore了吗,那怎么才能让开发者在调试的时候能够直接安装在手机上,而发布的时候必须在Appstore上呢?答案只有一个:描述文件.调试
还记得我们在申请证书以后想要成功的真机调试,还有一个重要步骤吧,就是分别配置开发模式、发布模式的描述文件吧"AAA.mobileprovision".你必需要在描述文件内部指定你的设备号,才能调试你对应的app吧。
描述文件是什么?其实就是一组权限控制的文件,它里面记录了能够被运行的设备、你的应用的appid、等其余权限类控制。口说无凭,我这里打开一个开发者模式的描述文件看一看。
security cms -Di test.mobileprovision
复制代码
咱们挑重要的看,它里面就直接记录了指定运行的手机设备号、这个证书日期、还有你开发者的相关信息,固然,你不要尝试着你手动更改他就可以绕过监控,看到那个<key>UIDI<key>了吗?这个描述文件也自带一组惟一编码的,也是会通过效验的,你想要更改信息,只能从苹果服务器去申请,他会随着你xocode打包的时候一块儿放入App。
举一个小小的例子。你消费了100元,并将此消息发送到服务器执行对应操做。这个时候彻底有可能出现一个第三方截获这个信息,将100元改成1000元再发给服务器啊。这时候,服务器只要将这个1000元进行一下hash,而后和你发过来的hash比较一下就知道了,由于你发过来的是对100元的hash。
hash是什么?消息摘要,签名是什么?就是对你的app的消息摘要!
仍是口说无凭,下面我来看一看。
解压你的app后这个文件夹里面就是你的签名,里面记录的是对你的资源类文件的签名:好比图片、音视频等。
找到你的macho文件,浏览一下,红圈的位置就是你二进制文件的消息签名。有了这两组签名,就保证了资源和二进制文件的一致性。 这就是咱们常说的签名。