最近处理挺多 ipa 包重签名以及发布审核出错等签名相关的问题,实践出真知,主要技巧重签名脚本、解包 codesign 命令核查签名是否正确等。证书签名有什么用呢?这就是为什么苹果除越狱外就一个 App Store 应用渠道,而安卓大家懂的,做游戏发布各个渠道搞死,签名机制总的来说就是苹果应用生态圈的控制方法吧。

加密解密算法

加密算法种类:

  1. 对称加密算法:加密解密都使用相同的密钥,速度快,适合大数据加密,方法有 DES、3DES、AES等。
  2. 非对称加密算法:非对称加密算法需要两个密钥一个公开密钥(publickey)和一个私有密钥(privatekey),公钥和私钥是一对,它是可逆的加密算法,若用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;若用私有密钥对数据进行加密,只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫做非对称加密算法 ( 公 / 私钥可由专门软件生成 )。适用对小数据加密,方法有 RSA。
  3. 散列算法:加密后不能解密是不可逆的,算法公开,对相同的数据加密得到的结果是一样的;对不同的数据加密,得到的结果是定长的,不能返算;又叫哈希函数、信息指纹,信息摘要 - 用来做数据识别。 方法有 MD5、SHA1、SHA256、SHA512、HMAC。

    非对称加密算法详解

    数字签名中就用到了非对称加密(公钥加密),因而多说下这个公钥加密。

公私钥重要特性

  • 对于一个私钥,有且只有一个与之对应的公钥。生产者负责生成私钥和公钥,并保存私钥,公开公钥。
  • 公钥是公开的,但不可能通过公钥反推出私钥,或者说极难反推,只能穷举,所以只要密钥长度足够长,要通过穷举出私钥几乎是不可能。
  • 通过私钥加密的密文只能通过公钥解密,公钥加密的密文只能通过私钥解密。

公钥私钥的生成

  • 公钥是由签名机构签完颁发的,放在网站的根目录上,可以分发。
  • 私钥一般保存在中心服务器。

非对称加密典型用法

  • 对信息保密,防止中间人攻击:将明文通过接收人的公钥加密,传输给接收人,因为只有接收人拥有对应的私钥,别人不可能拥有或者不可能通过公钥推算出私钥,所以传输过程中无法被中间人截获。只有拥有私钥的接收人才能阅读。此用法通常用于交换对称密钥。
  • 身份验证和防止篡改:权限狗用自己的私钥加密一段授权明文,并将授权明文和加密后的密文,以及公钥一并发送出来,接收方只需要通过公钥将密文解密后与授权明文对比是否一致,就可以判断明文在中途是否被篡改过。此方法用于数字签名。

RSA 算法原理

  1. 找出两个 “很大” 的质数:P & Q,N = P * Q,M = (P-1) * (Q-1)
  2. 找出整数 E ,E 与 M 互质,即除了之外,没有公约数。
  3. 找出整数 D,使得 ED 除以 M 余1,即 (E * D) % M = 1 。
  4. 经过上述准备工作之后,可以得到:E 是公钥,负责加密 D 是私钥,负责解密 N 负责公钥和私钥之间的联系
  5. 加密算法,假定对 X 进行加密 (X ^ E) % N = Y
  6. 解密算法,根据费尔马小定义,可以使用以下公式完成解密 (Y ^ D) % N = X

数字签名

签名作用
数字签名通过签名算法将消息签名得到密文,签名算法应该具有的特性:

  • 具备完整性,确认消息在传输过程中没有丢失,没有被篡改。
  • 具备认证合法性,确认消息的发送者是发布公钥的发布者。
  • 具备不可否认性,确认发布者的确发布过该消息。

签名原理
数字签名运用公钥加密(非对称加密算法)反用和散列算法。这里的反用是指签名者将讯息用私钥加密,然后公布公钥,验证者使用公钥将加密讯息解密,这种加密方式着重的是合法性或者说权限性,今天所讲的苹果签名原理就是这种;公钥加密的正用是指公钥加密私钥解密,如 HTTPS 私钥放在服务器进行解密验证,这种加密着重的是文件的完整性。

签名步骤
假设一个场景,A 是签名者,要签名的消息为 message,利用公钥加密算法反用加密。验证方为 B

  1. 将消息 message 通过散列算法的到散列值,定为这个散列值为签名对象
  2. A 生成其公私钥,公布该公钥。
  3. 利用公钥加密算法,将签名对象用私钥加密后密文、原消息 message 和对应的公钥一起发布。
  4. B 先查看公钥是否是 A 的,再用该公钥对密文进行解密得到散列值
  5. 将消息 message 用同样的散列算法得到散列值,再将两个散列值进行比对。

苹果签名示意图:

22.ng

数字证书

数字证书是什么
数字证书就是通过数字签名实现的数字化的证书,又称公钥证书、公开密钥证书、电子证书、安全证书。我们可以把比对着英语四级证、营业许可证等一样理解。其是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。

数字证书的格式普遍采用的是 X.509V3 国际标准,一个标准的 X.509 数字证书包含以下一些内容:

  • 证书的版本信息;
  • 证书的序列号,每个证书都有一个唯一的证书序列号;
  • 证书所使用的签名算法;
  • 证书的发行机构名称,命名规则一般采用X.500格式;
  • 证书的有效期,通用的证书一般采用UTC时间格式,它的计时范围为1950-2049;
  • 证书所有人的名称,命名规则一般采用X.500格式;
  • 证书所有人的公开密钥;
  • 证书发行者对证书的签名。

证书签发机构
数字证书的签发机构也有若干,并有不同的用处。比如苹果公司就可以签发跟苹果公司有关的证书,而跟 web 访问有关的证书则是由几家全世界公认的机构进行签发。这些签发机构称为 CA(Certificate Authority)。

对于被签发人,通常都是企业或开发者。对于需要搭建基于SSL的网站,那么需要从几家国际公认的CA去申请证书;对如需要开发iOS的应用程序,需要从苹果公司获得相关的证书。这些申请通常是企业或者开发者个人提交给CA的。当然申请所需要的材料、资质和费用都各不相同,是由这些CA制定的,比如苹果要求$99或者$299的费用。

web应用相关的SSL证书的验证方通常是浏览器;iOS各种证书的验证方是iOS设备。我们之所以必须从 CA 处申请证书,就是因为 CA 已经将整个验证过程规定好了。

证书信任链
数字证书可能还包括证书链信息。举个例子:如果你要申请休假1周,需要你的上司审批,你的上司需要他的上司同意,最终需要大老板同意,那么这一层层的授权,形成了一个授权链,大老板是授权链的根(root),中间这些环节分别是被更接近root的人授权的。

我们从苹果MC(Member Center)中获得的证书实际也是一个包含有证书链的证书,其中的根是苹果的CA。我们获得的证书实际上是在告诉iOS设备:我们的证书是被苹果CA签过名的合法的证书。而iOS设备在执行app前,首先要先验证CA的签名是否合法,然后再通过证书中我们的公钥验证程序是否的确是我们发布的,且中途没有对程序进行过篡改。

根证书

iOS 中证书和签名


23.png

  1. Mac 机器访问钥匙串从证书颁发机构请求证书得到 CertificateSigningRequest.certSigningRequest
  2. w

参考链接