查看原文
其他

iOS应用程序代码签名

中国光大银行 中国光大银行科技创新实验室 2024-01-09

对程序代码进行签名是保护应用程序的常用手段。我们常见的应用程序,如用于Windows中exe文件的微软PE格式程序、Linux中可执行的ELF格式、安卓和iOS的APP,甚至jar文件,均支持使用代码签名技术,对程序进行保护。


数字签名和手写签名类似,代表签名者对签名对象的认可。通过查看签名,可以确认应用程序来自可信的发行者。签名可以保护应用程序的完整性,对程序的篡改会破坏签名,导致程序不可使用。借助使用CA体系,建立信任链条,利用应用程序签名作为基石,还能建立可信的计算环境。



应用程序代码签名的基本原理

1.1

 非对称加密算法 

非对称加密算法是一切数字签名技术的基础。在非对称加密算法中,加密所用的密钥和解密所用密钥完全不同,且不可相互推导。将其中一支密钥作为私钥保存,另一支密钥作为公钥公开,私钥加密的数据,公钥可以解密,公钥加密的数据,对应的私钥可以解密。

如果使用私钥对数据进行加密,任何人只要能够用公钥对数据解密,就验证这些数据来自私钥的持有者。


1.2

 哈希算法 

哈希算法也叫散列或者摘要算法,对一段任意长度的数据,通过一定的映射和计算,得到一个固定长度的值,这个值就被称为这段数据的哈希值(hash)。安全领域使用的哈希算法具有以下特征:

  • 对于相同的数据,总能计算出相同的哈希值;

  • 对于不同的数据,计算出的哈希值不同;

  • 要找到数据不同,但有相同的哈希值的情形(哈希碰撞)是非常困难的

1.3

 数字签名 

利用非对称加密和哈希算法,就可以对数据进行签名和验签:

对数据计算哈希摘要,使用私钥对数据加密,就形成了签名。将签名和数据一起发送,接收方只要知道公钥,就能验证签名的有效性,从而且确认数据的完整性。


1.4

 签名证书 

对数据进行验签时要用到公钥,公钥可以随着数据一起下发。如果把公钥和所有者信息存放在一个文件中,并让一个可信的第三方对这个文件签名,得到一份签署好的公钥文件,这个文件就是证书,证书可以作为签名的一部分,随着数据一起分发。


1.5

 证书信任链 

要验证证书的有效性,就需要用到可信第三方的公钥,这个负责为用户签发证书的机构就是CA。而CA的公钥,也是以证书的形式发行的。CA证书可以由更高一级的CA签发,形成信任链条。顶级CA的根证书可以被预置在操作系统和浏览器中,作为信任根,逐级验证下级证书的有效性。


1.6

 应用程序签名 

通常的应用程序,都包含代码、数据、资源这三种要素。代码是可以执行的机器码或字节码,数据是程序中使用到的常量、变量初值等数据信息,资源是文本、图片、音视频等素材。应用程序在一定程度上说,是一个描述文件,告诉系统如何将上述要素加载到内存中运行,而这些要素决定了应用程序的所有功能和行为。


在应用程序的结构中,均有一些不影响应用程序行为和功能的扩展区域,应用程序的签名信息就放在这些区域内。当应用程序被安装或加载时,系统会首先检查签名信息,如果签名信息与程序一致,才会正常安装和加载。


具体到iOS APP 和安卓APP而言,iOS APP使用苹果签署的开发者证书签名,安卓APP采用自签发的证书签名。iOS在安装APP时会严格验证证书的合法性,从而保证了整个应用生态的封闭性和苹果对APP发行的垄断,而安卓APP的签名,仅用于验证APP发行者的前后一致性,要求APP的升级版本和原始版本必须来自同一个发行方。



iOS APP签名

2.1

 开发者证书 

iOS APP签名需要使用“开发者证书“。所谓开发者证书,就是由开发者向苹果公司注册申请,由苹果签发给APP开发者,供开发者自行使用、对APP进行签名的证书。


开发者在向苹果申请开发者证书时,需要先在本地生成公私钥对,将公钥和证书信息作为证书申请文件(.csr)发送至苹果公司,由苹果公司进行签名,并将签署后的公钥封装在证书文件(.cer)发还申请者,与私钥共同形成完整的签名证书,用于APP签名。


从上述过程中可以看出,在申请证书的过程中私钥始终由开发者持有,被提交和下载的只有公钥部分,无论csr文件还时cer文件都不需要保密。一般我们说“使用证书签名“,实质上是使用私钥签名。而.csr文件与.cer文件的格式则由X.509定义,遵循PKI相关的标准。


Mac系统中,使用称为“钥匙串“的工具对证书进行管理,”钥匙串“具有安全存储能力,能够保护私钥安全,同时提供证书申请、csr文件导出、cer文件导入、已有证书管理、运用等功能。


对于在App Store上架的应用而言,开发者的签名仅仅体现在提交发布环节,应用在App Store上架时,会被替换为苹果公司的签名。


2.2

 授权文件和Provisioning Profile 

出于安全考虑,iOS使用了沙箱技术支撑APP运行,并利用沙箱约束APP的行为,比如限制APP能够访问的硬件、服务等,这样一来,即使代码出现安全漏洞,也无法影响到沙箱外面的系统。


开发人员可以将APP所需用到的权限配置到授权文件,亦即Entitlements中,在执行签名时,授权信息会随同签名打入APP包内。这样在APP运行时,iOS就可以根据授权文件中指定的权限管理APP的行为。


为了方便测试工作,苹果允许开发者管理一个测试设备的白名单,让测试版的APP(使用测试版证书签名)在白名单内的移动设备上运行。为了将白名单以及其他一些重要信息嵌入APP内,苹果使用了名为Provisioning Profile的管理机制。


Provisioning Profile由开发人员登录苹果开发者账号,在线录入包括测试设备白名单等信息后,下载使用。文件内绑定了开发者账号、证书、授权文件、设备白名单等信息,苹果对这个文件进行了签名,以确保它不会被修改或伪造。


2.3

 签名过程 

Mac系统内用于APP签名的程序是codesign。codesign提供了一系列管理和查看APP签名信息的子命令。


使用codesign进行签名时,需要指定所用的授权文件、Provisioning Profile文件、证书名称,当然也需要指定被签署的程序。通常情况下,IDE工具会管理签名过程,用户不需要直接使用codesign。


2.4

 IPA文件的结构 

.ipa文件是iOS APP的封装包,其实是一个zip文件,解压之后,可见一个名为Payload的目录,目录内是APP的程序和所依赖的资源文件。


其中embedded.mobileprovision 就是 Provisioning Profile,_CodeSignature目录内的CodeResources文件记录着各个资源文件的哈希值。


那么签名信息在哪里呢?答案是在可执行文件中。


iOS的可执行文件采用了Mach-o格式,这是一种与PE(windows EXE)格式、ELF格式作用类似的可执行文件格式,特点是可以用一个二进制文件封装多种可执行指令集,发布跨CPU体系结构的应用。


和区块链类似,APP中的所有要素通过层层哈希链接起来,最后形成签名信息,放入March-o格式的可执行文件中。



总结

利用APP签名,苹果公司创建了相对安全的应用程序计算环境,建立了繁荣的APP生态,建立了AppStore的高度垄断性经营,创造了商业神话。可以说APP签名是整个苹果生态系统的基石。


对于大多数开发者而言,Xcode等IDE工具已经能够处理证书和签名的相关的工作,无须了解具体细节。但了解这些内容,有助于我们构建更好的企业应用开发环境。


作者 | 张剑强

视觉 | 王朋玉

统筹 | 郑    洁

继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存