iOS数字签名、代码签名、双重签名详解

论坛 期权论坛 期权     
WILLIAMALEX   2019-10-27 05:54   1774   0
经常听到关于iOS的一些签名,什么数字签名,代码签名,双重签名等,那这些签名都是代表什么意思啦?我们在这里具体的说说签名那些事。



[h3]一、数字签名:[/h3]1.1、数字签名的过程:
例子:

模拟下数据传递过程,客户端A传数据给服务端B:


问题:
a、如果直接明文传递,裸传,风险最大,例如http,很容易被抓包;


b、后面有专门的Hash算法(专门是用来识别信息的),如果加上Hash算法,将明文跟Hash值传过去,对方收到后可以拿出HASH值来进行验证。如果Hash算法泄漏了,同样不安全,也很容易被篡改。


c、所以这里我们要对数据进行加密,明文数据有时会比较大,不适合使用RSA非对称加密算法,那么数据的HASH值是比较小的。然后客户端A将签名后的数据跟明文一起传给服务端B。
具体的过程如下:




签名过程



这就是整个数据签名的过程,总的来说,就是一句话:需要传输的数据,通过HASH算法,得到该数据的HASH值,该HASH值,在通过非对称加密RSA,对该数据的HASH值进行加密。加密完 ,在把该数据的原始数据和该数据的加密的HASH值一起传给对方。



1.2、数字签名的验证过程:
当对方拿到数据之后,如何进行验证呢?
a、服务端B收到原始的数据和数字签名后,先进行校验.拿到原始数据,通过同样的HASH算法得到数据的HASH值.
b、通过非对称加密,将数字签名中的校验HASH值解密出来
c、对比两个HASH值是否一致.这样可以很好的判断数据是否被篡改。
具体如下:


数字签名验证过程



总结
  1. 数字签名技术是将摘要信息用发送者的私钥加密,与原文一起传送给接收者。
复制代码
  1. 接收者只有用发送者的公钥才能解密被加密的摘要信息,
复制代码
  1. 然后用Hash函数对收到的原文产生一个摘要信息,与解密的摘要信息对比。
复制代码
  1. 如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,
复制代码
  1. 否则说明信息被修改过,因此数字签名能够验证信息的完整性。
复制代码

[h3]二、代码签名[/h3]苹果也是通过代码签名来保证每一个安装到iOS上的APP都是经过苹果官方允许的,防止盗版软件、病毒入侵、静默安装等。如果想要实现验证,最简单的方式就是通过苹果官方生成非对称加密的一对公私钥,在iOS系统中内置一个与服务器对应的公钥,私钥由苹果后台来保存,我们传APP到App Store时,苹果后来用私钥对APP数据进行签名,iOS系统下载这个APP后,用公钥验证这个签名,如果签名正确则这个APP肯定是由苹果后台认证的,并且没有被修改或损坏。
整个过程很简单,这样就保证了苹果安装的每一个APP都是经过苹果官方允许的。对于大部分普通用户而言,这样一个数字签名就解决了安全隐患问题,但是实际上iOS设备安装APP并不是只有App Store这一个渠道,比如对于我们iOSer来说,我们在开发APP时还在真机调试,当然苹果还开放了企业内部分发的渠道,这时就无法通过简单的代码签名来满足这些需求了。
苹果为了实现这些需求,iOS签名的复杂度也就开始增加了,这样双层代码签名(双重签名)就出现了。
总结:
  1. 代码签名是对可执行文件或脚本进行数字签名,
复制代码
  1. 用来标识软件来源以及软件开发者的真实身份,
复制代码
  1. 确认软件在签名后未被修改或损坏的措施。和数字签名原理一样,
复制代码
  1. 只不过签名的数据是代码而已。
复制代码
[h3]
[/h3][h3]三、双重签名(双层代码签名)
[/h3]3.1、双重签名过程:
我们知道,从事app开发的,如果要run到真机上,或者发不到appstore,或者通过蒲公英等其他分发网站,第一步都是需要去苹果官网申请证书,包括开发证书和发布证书。
请求证书
开发过程中,首先Mac电脑(比如Xcode)会自动生成一对公私钥




钥匙串中的秘钥对


图中的证书就是公钥M,专用密钥就是私钥M(也就是我们导出的P12文件)



用一个CSR文件(就是在钥匙串访问中,证书助理,从证书颁发机构中获取的)向苹果申请一个证书,这个CSR文件主要包含了一个公钥文件,还有一些信息,比如邮箱、名字、签名信息、Hash值等等,苹果收到请求后,会用私钥A将公钥M进行签名,以供苹果设备进行验证(用公钥A进行验证)。苹果服务器将公钥M和签名信息打包成证书,并把appID、证书、设备IDs、权限文件等放入描述文件一并返回给Mac电脑,以备Mac电脑用这个描述文件中的证书到iOS设备去验证。


CSR证书的原理





生成IPA文件,发送到iOS设备上
iOS设备上的APP其实都是文件夹,最重要的是可执行文件MachO和framework,APP签名也就是对它俩进行签名,通过Mac电脑的私钥M对文件进行签名,把这个签名和从苹果申请的描述文件一并放入到APP中。当安装APP时,iOS设备用公钥A来解析描述文件中的证书进行验证证书的有效性,通过之后将证书中的公钥M拿出来,再去验证APP签名的有效性,这样就可以验证当前APP是否是苹果官方允许的。




双层代码签名




在开发阶段,我们需要频繁的改动程序跑真机,苹果不需要关心这些,所以iOS设备没有对APP的更改进行验证,只是验证证书(公钥M是不是合法的,APP签名的有效性)。这样解决了安装问题,但是如果这样的话,可以在任何一部iOS设备上安装APP,苹果防止开发者滥用,又加了两个限制:
要在苹果后台注册过的设备才可以安装
签名只能针对具体的某一个APP进行签名
最后关于APP签名:
在开发中,编译一个APP后,用本地的私钥M对APP进行签名,同时把从苹果服务器得到的Provisioning Profile文件打包进APP中,文件名为embedded.mobileprovision,把APP安装到iOS设备后,系统进行验证。

查看包内容



查看APP的包内容,里面会有_CodeSignature文件夹(里面的就是资源文件的签名),还有个可执行文件,可以用MachO查看,里面的Code signature就是应用签名。


总结:
  1. 在真机调试时候,都会有一个描述文件,描述文件就是在developer.apple.com创建
复制代码
  1. 的,在Xcode中填入AppID后会代办创建,Xcode运行时会打包进APP中。
复制代码
  1. 为了系统安全,苹果除了控制APP滥用问题还控制了推送、iCloud、调试器等附加
复制代码
  1. 这些权限,苹果把这些权限开关统一称为Entitlements(授权文件)。
复制代码
  1. 并将这个文件放在了一个叫做Provisioning Profile(描述文件)文件中,
复制代码
  1. 描述文件里面就包括权限、证书等配置相关文件。
复制代码



注意: 文章转载于简书飞哥Andy的博客,主要用于学习参考。
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:
帖子:
精华:
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP