iOS逆向重签名(一):签名原理

目录:

1. iOS逆向重签名(一):签名原理
2. iOS逆向重签名(二):IPA重签名
3. iOS逆向重签名(三):微信重签名

在了解iOS签名原理之前,需要有一定的密码学知识,否则有些东西无法理解。所以在学习iOS签名原理之前,先跟小编一起学习一下简单的密码学知识。

一、简单的密码学知识

1.1 非对称加密算法

非对称加密就是加密和解密使用的不是相同的密钥:只有同一个公钥-私钥对才能正常加解密。公钥是可以公开的,而私钥是完全保密的。

如果小明要加密一个文件发送给小红,他应该首先向小红索取她的公钥,然后,他用小红的公钥加密,把加密文件发送给小红,此文件只能由小红的私钥解开,因为小红的私钥在她自己手里,所以,除了小红,没有任何人能解开此文件。

1.2 数字签名

我们使用非对称加密算法的时候,对于一个公钥-私钥对,通常是用公钥加密,私钥解密。

如果使用私钥加密,公钥解密是否可行呢?实际上是完全可行的。

不过我们再仔细想一想,私钥是保密的,而公钥是公开的,用私钥加密,那相当于所有人都可以用公钥解密。这个加密有什么意义?

这个加密的意义在于,如果小明用自己的私钥加密了一条消息,比如小明喜欢小红,然后他公开了加密消息,由于任何人都可以用小明的公钥解密,从而使得任何人都可以确认小明喜欢小红这条消息肯定是小明发出的,其他人不能伪造这个消息,小明也不能抵赖这条消息不是自己写的。

因此,私钥加密得到的密文实际上就是数字签名,要验证这个签名是否正确,只能用私钥持有者的公钥进行解密验证。使用数字签名的目的是为了确认某个信息确实是由某个发送方发送的,任何人都不可能伪造消息,并且,发送方也不能抵赖。

1.3 数字证书

我们知道,摘要算法用来确保数据没有被篡改,非对称加密算法可以对数据进行加解密,签名算法可以确保数据完整性和抗否认性,把这些算法集合到一起,并搞一套完善的标准,这就是数字证书。

因此,数字证书就是集合了多种密码学算法,用于实现数据加解密、身份认证、签名等多种功能的一种安全标准。

二、iOS 签名原理

2.1 签名的目的

在iOS系统出来之前,在很多主流的操作系统开发和安装软件都是不需要签名的,开发者开发完了软件可以直接给用户使用。虽然这样很方便,但是却存在很大的漏洞,因为任何开发者都可以开发软件上传到平台,用户没有识别能力,很可能就下载了别人开发的恶意软件或者是山寨软件等。所以苹果就设计了一套规则,用来保证每一个安装到用户手机里的APP是通过苹果官方认证的。

2.2 确保 iPhone 手机只能安装经过苹果认证的 APP
2.2.1 通过AppStore安装

苹果生成了一对公私钥,私钥保存在苹果服务器里,公钥内置在iOS手机里。从AppStore上下载的APP都是经过苹果服务器里的私钥签名的,iOS手机下载了应用之后,用iOS手机里的公钥去验证这个签名,如果验证成功,则说明这个APP就是苹果官方认证的,则被允许安装在iPhone手机中。

其实这里是运用了非对称加密中,用私钥加密,公钥解密,就能确认某个信息确实是由某个发送方发送的,并且任何人都不可能伪造消息。

但是,这种方式只能保证从AppStore上下载的APP,是经过苹果官方认证的。

APP的安装方式其实有三种:

  1. 从AppStore上下载应用,安装到iOS手机。
  2. 通过企业证书签名,安装到iOS手机。
  3. 通过开发者证书签名,安装到iOS手机。

其实,第二种和第三种安装方式,是不通过AppStore的,安装包不需要传到苹果服务器,可以直接安装到手机上,所以无法用苹果服务器的私钥签名。那么这种情况要怎么处理呢?苹果针对这种情况推出了开发者证书。

2.2.2 不通过AppStore安装

每个iOS开发者申请到苹果开发者账号之后,在进行开发APP之前,都需要用自己的苹果电脑生成一个证书请求文件,然后上传到苹果服务器,苹果服务器生成一个开发者证书,开发者需要把这个苹果开发者证书下载到本地,并进行安装。做为一个iOS开发者,你有想过这一系统操作是干嘛么?

下面小编为大家来讲解一下,这样操作的原因。

  1. 用苹果电脑创建证书请求文件的时候,其实苹果电脑生成了一对公私钥,私钥是保存在苹果电脑里面,公钥就被放在了证书请求文件中了。证书请求文件被上传到苹果服务器,苹果服务器就能从证书请求文件中读取到开发者电脑的公钥 (公钥L,L : Local)。
  2. 苹果服务器用自己的私钥 (私钥A,A : Apple),给公钥L签名,并生成了一个数字证书,这个数字证书其实就是我们平常所谓的苹果开发者证书。
  3. 在开发者编译完一个App后,系统会用本地的私钥L对该App进行签名,同时会把苹果开发者证书一同打包到App中,形成最终的安装包。
  4. iPhone在安装App时,先用手机里的公钥A去验证苹果开发者证书,苹果开发者证书里面的数据其实是用私钥A加密了公钥L。如果验证成功,就能获取公钥L,然后再用公钥L去验证被私钥L签名了的安装包。这里就间接验证了这个App的安装行为是否经过苹果官方允许。这里只验证安装行为,不验证App是否被改动,因为开发阶段App内容总是不断变化的,苹果不需要管。

方法的改进

这样的方式,没有验证App的内容。一些开发者就可能利用这种方式去给iPhone安装一些不合格或者非法的应用。所以这种方式存在漏洞,会导致App安装被滥用。怎么解决呢?苹果加了两个限制,一是限制在苹果后台注册过的设备才可以安装;二是限制签名只能针对某一个具体的App。

苹果用私钥A签名我们的本地公钥L时,实际上除了签名本地公钥L外,还可以加上无限多数据,这些数据都可以保证是经过苹果官方认证的,不会有被篡改的可能。可以想到把允许安装的设备ID列表和App对应的AppID等数据,都在第二步这里跟公钥L一起组成证书,再用苹果私钥A对这个证书签名。在最后第四步验证时就可以拿到设备ID列表,判断当前设备是否符合要求。根据数字签名的原理,只要数字签名通过验证,第四步这里的设备IDs、AppID、公钥L就都是经过苹果认证的,无法被修改,苹果就可以限制可安装的设备和APP,避免滥用。

最终方案

到这里这个证书已经变得很复杂了,有很多额外信息,实际上除了设备ID/AppID,还有其他信息也需要在这里用苹果签名,像App里iCloud、push、后台运行 等权限苹果都想控制,苹果把这些权限开关统称为Entitlements,它也需要通过签名去授权。

实际上一个证书本来就有规定的格式规范,上面我们把各种额外的信息塞入证书里是不合适的,于是苹果另外搞了一个东西,叫Provisioning Profile,一个Provisioning Profile里就包含了证书以及上述提到的所有额外信息,以及所有信息的签名。

我们再来重新梳理一遍整个流程:

  1. 苹果自己有一对公私钥A,私钥A保存在苹果后台服务器,公钥A内置在iOS手机中。苹果电脑生成一对公私钥L,私钥L保存在电脑中,公钥L会被上传到苹果服务器。
  2. 苹果服务器用自己的私钥A,给公钥L签名,生成一个数字证书,叫做苹果开发者证书。
  3. 在苹果后台申请AppID时,配置好设备ID列表和APP可使用的权限,再加上第2步的证书,组成的数据用私钥A签名,把数据和签名一起组成一个Provisioning Profile文件,下载到苹果电脑本地并安装。
  4. 在开发时,编译完一个APP后,用本地的私钥L对这个APP进行签名,同时把第3步得到的Provisioning Profile文件打包进APP里,文件名为 embedded.mobileprovision,把APP安装到手机里。
  5. 在安装时,iOS系统取得证书,通过系统内置的公钥A,去验证 embedded.mobileprovision的数字签名是否正确,里面的证书签名也会再验一遍。确保了embedded.mobileprovision里的数据都是苹果授权以后,就可以取出里面的数据,做各种验证,包括用公钥L验证APP签名,验证设备ID是否在ID列表上,AppID是否对应得上,权限开关是否跟APP里的Entitlements对应等。
2.2.3 概念和操作解释

(1) keychain里的“从证书颁发机构请求证书”,这里就本地生成了一对公私钥,保存的CertificateSigningRequest就是公钥,私钥保存在本地电脑里。

(2) 把CertificateSigningRequest传到苹果后台生成证书,并下载到本地。这时本地有两个证书,一个是第1步生成的,一个是这里下载回来的,keychain会把这两个证书关联起来,因为它们的公私钥是对应的,在Xcode选择下载回来的证书的时,实际上会找到keychain里面对应的私钥去签名。这里私钥只有生成它的这台Mac才有,如果别的Mac也要编译签名这个App,怎么办?答案是把私钥导出给其他Mac使用,在keychain里面导出私钥,就会存成.p12文件,其他Mac打开后就导入私钥。

(3) 第5步Xcode会通过第3步下载回来的证书(存着本地公钥),在本地找到对应的私钥(第1步生成的),用本地私钥去签名App,并把Provisioning Profile文件命名为embedded.mobileprovision一起打包进去。这里对App的签名数据保存分为两部分,Mach-O可执行文件会把签名直接写入这个文件里,其他资源文件则会保存在_CodeSignature目录下。

这里再总结一下这些概念:

证书:内容是公钥或私钥,由其他机构对其签名组成的数据包。

Entitlements:包含了App权限开关列表。

CertificateSigningRequest:本地公钥。

.p12:本地私钥,可以导入到其他电脑。

Provisioning Profile:包含了 证书/Entitlements 等数据,并由苹果后台私钥签名的数据包。

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长沙火山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值