AppStore官方商店购买,公司证书安装或TestFlight下载。为了阻止盗版,软禁,病毒入侵,无提示安装和其他您无法控制的因素,并确保正式允许iOS设备上安装的所有应用程序,Apple建立了一套应用程序签名机制。
电子签名
数字签名,也称为公钥数字签名,是只能由信息发送者生成的数字字符串,不能被他人伪造。发件人使用签名标记对要发送的数据进行签名,以表明该数据已通过身份验证并且未被篡改。
数据传输
让我们模拟数据传输过程。
如果发件人以纯文本格式直接将原始数据发送给收件人,则数据非常不安全并且容易被篡改。
为了提高安全性并同时简化纯文本,您可以对数据进行哈希处理以获得原始数据的摘要,然后将摘要发送给收件人。但是,如果散列算法泄漏,则存在数据篡改的风险。
它引入了一种非对称加密算法,使用哈希算法对数据片段计算摘要,然后使用RSA私钥对摘要进行加密,以获得原始数据的数字签名。发件人将数字签名与原始数据一起发送给收件人。
经过哈希加密和非对称加密后的原始数据称为数字签名。
接收到数据后,接收方必须执行签名验证,以确保在数据传输过程中未对其进行篡改。
数字签名验证
验证签名的具体步骤如下:
接收到数据后,原始数据将使用相同的哈希进行加密以获得哈希值(摘要)。
然后,它使用不对称性来解密数字签名的验证哈希值(摘要)。
最后,将两个哈希值进行比较以查看它们是否一致,以查看数据是否已被篡改。
恢复数字签名和照片的整个过程:
让我们看看如何使用数字签名来确保iOS上安装的所有应用程序都经过Apple的批准。
代码签名
代码签名是一种在签名后对可执行文件或脚本进行数字签名的方法,以确保软件没有被修改或损坏。它的原理类似于数字签名,不同之处在于它是签名代码,而不是数据。
简单的代码签名
如果您只能从App Store下载该应用程序,则检查方法相对简单。
公钥和私钥对由Apple正式生成,公钥内置在iOS系统中,并且私钥存储在Apple后台。
当您将应用程序上载到App Store时,Apple后端会使用您的私钥对应用程序数据进行签名。 iOS系统下载应用程序后,公共密钥会验证签名。如果签名正确,则必须在Apple后端对应用进行身份验证,并且该应用已被修改或损坏。但是,App Store并不是在iOS设备上安装应用程序的唯一渠道,包括开发人员的现场调试,TestFlight的内部测试以及内部公司证书的分发。目前,简单的代码签名无法满足应用程序的完整验证。
这会增加iOS代码签名的复杂性,从而导致双重代码签名(双重签名)。
双码签名
“双层”旨在使用两对公钥和私钥进行密码验证。这是Mac上的一对,Apple服务提供的一对。
双重代码签名的存在是为了满足以下条件:
您必须获得Apple的批准才能安装该应用程序。
您只能安装在Apple后台注册的设备,例如TestFlight内部测试和真实设备调试模式。
受限制的签名可能特定于唯一的应用程序。
您可以解压缩ipa文件以猜测整个签名过程。有效负载目录中有embed.mobileprovision,这称为描述文件,与在Apple后台创建的PP(Provisioning Profile)文件相对应。这些文件包含:
证书(公钥,签名)
应用程式编号
资格(权限)
已注册设备列表
有关应用程序是否可以正常启动的任何其他信息
因此,大致的签名过程如下:
在开发设备Mac上本地生成公用和专用密钥对。
苹果有一对公钥和私钥,苹果私钥在苹果的后端,而苹果公钥在每个iOS设备上。
通过将Mac公钥上载到Apple后端,并使用Apple私钥对Mac公钥签名,您将获得Mac公钥和签名数据的组合,称为证书。
在Apple后台中,当您申请App ID,应用程序应用的已配置UDID(已注册设备)和权利的列表以及步骤3中的证书时,使用Apple私钥对合并的数据进行签名,然后将数据和签名一起应用。创建一个PP文件并将其下载到本地开发设备Mac。
编译项目时,Mac私钥会对该应用程序进行签名,同时打包在步骤4中获得的PP文件,文件名将被嵌入。mobileprovision,该应用程序已准备好在手机上安装。
在安装过程中,iOS系统会获取证书,并使用内置的Apple公钥来验证证书是否正确签名。继续使用Apple公钥验证您的个人资料是否正确。
使用Mac公钥检查应用程序签名是否已被篡改。
在此处插入照片说明
以上步骤对应于实际任务和概念,例如:
步骤1:在Mac上打开“钥匙串访问→证书支持→向证书颁发机构申请证书.”。此步骤将在本地生成公用和专用密钥对,并具有导出的CSR文件(CertificateSigningRequest.certSigningRequest)。被建造。 Mac公钥和Mac私钥也存储在本地。有关特定文件,请参见步骤3。
步骤2:每个iOS设备已经具有Apple公钥。有关Apple私钥的含义,请参见步骤3。
步骤3:在Apple后端上载从iOS证书模块本地导出的CSR文件,以生成.cer证书文件,这是Apple私钥。在本地下载.cer证书,安装证书,在钥匙串中找到证书,然后导出Mac私有密钥(.p12文件)。对应于步骤1中导出的Mac公钥。钥匙串连接这两个证书。使用.cer证书签署CSR文件,然后导入签署的证书。
步骤4:在Apple Background中配置应用程序ID,权限,设备等,然后下载PP文件。
步骤5:在编译应用程序时,Xcode将使用您在步骤3中下载的证书(使用Mac公钥)在本地找到该Mac私钥,然后使用Mac私钥对应用进行签名和打包,然后将其安装到软件包中。做吧包含PP文件,ipa的文件名为embed.mobileprovision。在这里,应用程序的签名数据分为两部分:Mach-O可执行文件直接对描述文件进行签名,资源文件存储在_CodeSignature目录中,并且可以安装应用程序。
步骤6:使用Apple公钥验证描述文件的签名。已经传递了与步骤4相对应的签名,以指示可以使用该证书,然后继续进行下一步。
步骤7:使用Apple Public Key验证证书签名。传递对应于步骤3的签名,表明Mac公钥是合法的。转到下一步。
步骤8:使用Mac公钥验证应用签名。对应于步骤4。通过以上所有检查后,您需要检查描述文件的内容,并将其与应用本身中的信息进行比较(例如,设备ID是否在UDID列表中)。一旦应用程序ID相同,权限开关就会与权利匹配,并且都经过验证,您就可以开始安装应用程序了。如前所述,双层代码签名是用于开发测试程序包,内部公司签名和Ad-Hoc程序包的签名和验证过程,但是公司签名并不限制已安装设备的数量,因此没有描述文件。设备列表,但ProvisionsAllDevices小于或大于true的记录。
从App Store下载的安装包没有描述文件,但是您需要进行应用ID和权限检查,因此需要在将证书和PP文件放到架子上之前对其进行配置。但是,在将应用程序上载到App Store之后,它与PP文件无关,因此您可以理解,App Store中软件包的签名验证使用上述最简单的签名方法,而Apple背景直接使用私钥对应用程序进行签名。