苹果App双向签名验证原理

双向签名:

手机和苹果服务器还有开发人员的MAC电脑,他们一共维护着2对公私钥,利用这两对公私钥分别完成双向签名与验证,从而已到达苹果服务器对苹果手机里的appstore的控制权,辨别此app是不是通过受权的。安全


Mac电脑做为开发者的电脑,本身有一组公私钥M,而后苹果服务器本身有一个私钥A,而后手机端保存了一份苹果服务器的公钥A。公钥加密的文件只有对应的私钥才能解开,反之私钥加密的文件只有对应的公钥才能解开。bash

第一步:从苹果服务器获取开发者证书过程

1.Mac先发送本身的公钥M向服务器,请求证书。

这里的公钥M CSR文件从哪来呢?他其实就是咱们要生成证书以前从“钥匙串访问>证书助理”获取的那个文件:
公钥M.png

这个文件很熟悉吧,这就是MAC端的公钥M,固然口说无凭,咱们能够打开看一下。服务器

openssl asn1parse -i -in CertificateSigningRequest.certSigningRequest
复制代码

结果以下:


注意这个红圈的位置,他指定了采用sha256 RSA加密方式。 这就是你与苹果服务器之间的加密方式。app

2.苹果下发证书

苹果拿到公钥M以后,会采用本身的私钥A对你的公钥M和CSR文件里面的hash值进行加密而后发送给你,这个就是你申请到的开发者证书。
iphone

这里有个小tip:


为何请求证书的MAC电脑能够直接打包编译,而给另外一台MAC就必需要给他P12文件才能编译app? 其实就是由于你给别人P12文件里面包含了私钥M,而直接给证书是不包含私钥M的。就是图上的那个小钥匙。

第二步:Mac电脑拿到证书后生成App


生成应用的时候,Mac用本身的私钥M对咱们的App进行了一次签名,而后将真正的可执行文件Macho+App的签名+苹果下发的证书共同打包生成了咱们的app包,这个就是安装在手机的上的文件。
固然口说无凭,咱们能够对app包打开看一下编码



这里三个划红线的地方分别就是咱们的APP签名信息、Macho能够行文件、证书。加密

第三步:验证App是否有效


1.获取公钥M

咱们的iphone利用本身的公钥A,解开苹果服务器私钥A签名的证书,获取到里面的公钥M。spa

2.利用公钥M验证签名

利用获得的公钥M继续解开Mac电脑私钥M的App签名,从而验证APP是否有效。
这就是苹果的APP的双向签名原理。3d


有了上面那个流程后,看似安全了,但是他真的完美了吗?其实仍是有一个缺陷的,开发者彻底能够拿到证书后直接给手机安装上,这样作不是就绕开Appstore了吗,那怎么才能让开发者在调试的时候能够直接安装在手机上,而发布的时候必须在Appstore上呢?答案只有一个:描述文件.调试

描述文件


还记得我们在申请证书以后想要成功的真机调试,还有一个重要步骤吧,就是分别配置开发模式、发布模式的描述文件吧"AAA.mobileprovision".你必需要在描述文件内部指定你的设备号,才能调试你对应的app吧。
描述文件是什么?其实就是一组权限控制的文件,它里面记录了能够被运行的设备、你的应用的appid、等其余权限类控制。口说无凭,我这里打开一个开发者模式的描述文件看一看。

security cms -Di test.mobileprovision 
复制代码

咱们挑重要的看,它里面就直接记录了指定运行的手机设备号、这个证书日期、还有你开发者的相关信息,固然,你不要尝试着你手动更改他就可以绕过监控,看到那个<key>UIDI<key>了吗?这个描述文件也自带一组惟一编码的,也是会通过效验的,你想要更改信息,只能从苹果服务器去申请,他会随着你xocode打包的时候一块儿放入App。

签名信息

1.签名究竟是什么?

举一个小小的例子。你消费了100元,并将此消息发送到服务器执行对应操做。这个时候彻底有可能出现一个第三方截获这个信息,将100元改成1000元再发给服务器啊。这时候,服务器只要将这个1000元进行一下hash,而后和你发过来的hash比较一下就知道了,由于你发过来的是对100元的hash。
hash是什么?消息摘要,签名是什么?就是对你的app的消息摘要!

2.签名信息

仍是口说无凭,下面我来看一看。



解压你的app后这个文件夹里面就是你的签名,里面记录的是对你的资源类文件的签名:好比图片、音视频等。



找到你的macho文件,浏览一下,红圈的位置就是你二进制文件的消息签名。有了这两组签名,就保证了资源和二进制文件的一致性。 这就是咱们常说的签名。

相关文章
相关标签/搜索