【iOS】iOS逆向系列十 - 签名机制(一)

我们可以通过tweak注入动态库的形式修改APP的逻辑,也可以通过汇编直接修改APP的可执行文件,但是修改后的APP只能在越狱手机上运行,如果想安装到非越狱手机上就需要对APP进行重签名。

签名涉及到密码学,在了解签名之前先简单介绍一下相关加密解密算法。

一、加密解密

为了便于理解,设计4个虚拟人物:

  • Alice、Bob:互相通信
  • Eve:窃听者
  • Mallory:主动攻击者

1.1. 如何防止被窃听?

  • 信息发送者Alice对信息进行加密

  • 信息接收者Bob对信息进行解密

  • 此时窃听者Eve只能窃听到密文

1.2. 如何加密解密?

同一个密钥可以对信息进行加密解密。

1.3. 密码的类型

根据密钥的使用方法,可以将密码分为2种:

  • 对称密码

  • 公钥密码(非对称密码)

二、对称密码

在对称密码(Symmetric Cryptography)中,加密和解密时使用的是同一个密钥。

常见的对称密码算法有:

  • DES
  • 3DES
  • AES

2.1. DES

DES(Data Encryption Standard)是一种将64bit明文加密成64bit密文的对称密码算法。

密钥长度是56bit。规格上来说,密钥长度是64bit,但每隔7bit会设置一个用于错误检查的bit,因此密钥长度实质上是56bit。由于DES每次只能加密64bit的数据,遇到比较大的数据,需要对DES加密进行迭代(反复)。

目前已经可以在短时间内被破解,所以不建议使用

2.2. 3DES

3DES,将DES重复3次所得到的一种密码算法,也叫做3重DES。

目前还被一些银行等机构使用,但处理速度不高,安全性逐渐暴露出问题。

3个密钥都是不同的,也称为DES-EDE3。

  • 如果所有密钥都使用同一个,则结果与普通的DES是等价的。

  • 如果密钥1、密钥3相同,密钥2不同,称为DES-EDE2。

2.3. AES

AES(Advanced Encryption Standard)是取代DES成为新标准的一种对称密码算法,在2000年时选择Rijindael算法作为AES的实现。AES的密钥长度有128、192、256bit三种。目前AES已经逐步取代DES、3DES,成为首选的对称密码算法

一般来说,我们也不应该去使用任何自制的密码算法,而是应该使用AES,它经过了全世界密码学家所进行的高品质验证工作。

2.4. 密钥配送

在使用对称密码时,一定会遇到密钥配送问题。

假设,Alice将使用对称密码加密过的消息发给了Bob,只有将密钥发送给Bob,Bob才能完成解密,但在发送密钥过程中可能会被Eve窃取密钥,最后Eve也能完成解密。

如何解决密钥配送问题?有以下几种解决密钥配送的方法:

  • 事先共享密钥
  • 密钥分配中心
  • Diffie-Hellman密钥交换
  • 公钥密码

三、公钥密码(非对称密码)

公钥密码(Public-key Cryptography),也被称为非对称密码Asymmetric Cryptography)。它的密钥分为加密密钥解密密钥2种,它们并不是同一个密钥。

特点:

  • 加密密钥,一般是公开的,因此该密钥称为公钥(public key)。
  • 解密密钥,由消息接收者自己保管的,不能公开,因此也称为私钥(private key)。
  • 公钥和私钥是一 一对应的,是不能单独生成的,一对公钥和密钥统称为密钥对(key pair)。
  • 由公钥加密的密文,必须使用与该公钥对应的私钥才能解密
  • 由私钥加密的密文,必须使用与该私钥对应的公钥才能解密

目前使用最广泛的公钥密码算法是RSA。RSA的名字由它的3位开发者,即Ron Rivest、Adi Shamir、Leonard Adleman的姓氏首字母组成。

3.1. 解决密钥配送问题

由消息的接收者,生成一对公钥、私钥,将公钥发给消息的发送者,消息的发送者使用公钥加密消息。

3.2. 混合密码

对称密码的缺点:不能很好地解决密钥配送问题。
公钥密码的缺点:加密解密速度比较慢(对称密码是位运算,公钥密码涉及到幂运算和模运算)。

混合密码系统,是将对称密码和公钥密码的优势相结合的方法。解决了公钥密码速度慢的问题,并通过公钥密码解决了对称密码的密钥配送问题。网络上的密码通信所用的SSL/TLS都运用了混合密码系统。

3.2.1. 加密

加密步骤(发送消息):

  1. 首先,消息发送者要拥有消息接收者的公钥;
  2. 生成会话密钥,作为对称密码的密钥对消息进行加密;
  3. 用消息接收者的公钥,加密会话密钥;
  4. 把第2、3步的加密结果,一并发给消息接收者。发送出去的内容包括:
    • 用会话密钥加密的消息(加密方法:对称密码)
    • 用公钥加密的会话密钥(加密方法:公钥密码)

会话密钥(session key)是本次通信随机生成的临时密钥。作为对称密码的密钥,用于加密消息,提高速度。

发送过程(加密过程):

  1. Bob生成一对公钥、私钥;
  2. Bob把公钥共享给Alice;
  3. Alice随机生成一个会话密钥(临时密钥);
  4. Alice用会话密钥加密需要发送的消息(使用的是对称密码加密);
  5. Alice用Bob的公钥加密会话密钥(使用的是公钥密码加密,也就是非对称密码加密);
  6. Alice把第4、5步的加密结果,一并发送给Bob。

3.2.2. 解密

解密步骤(收到消息):

  1. 消息接收者用自己的私钥解密出会话密钥;
  2. 再用第1步解密出来的会话密钥,解密消息。

接收过程(解密过程):

  1. Bob利用自己的私钥解密会话密钥(使用的是公钥密码解密,也就是非对称密码解密);
  2. Bob利用第1步解密后的会话密钥解密发送过来的消息(使用的是对称密码解密)。

四、单向散列函数

单向散列函数(One-way hash function),又被称为消息摘要函数message digest function),哈希函数。可以根据消息内容计算出散列值。输出的散列值,也被称为消息摘要(message digest)、指纹(fingerprint)。

散列值的长度和消息的长度无关,无论消息是1bit、10M、100G,单向散列函数都会计算出固定长度的散列值。

4.1. 散列函数的特点

  • 根据任意长度的消息,计算出固定长度的散列值
  • 计算速度快,能快速计算出散列值
  • 消息不同,散列值也不同

  • 具备单向性

4.2. 常见的几种单向散列函数

  • MD4、MD5

    • 产生128bit的散列值,MD就是Message Digest的缩写,目前已经不安全

    • Mac终端上默认可以使用md5命令

  • SHA-1

    • 产生160bit的散列值,目前已经不安全
  • SHA-2

    • SHA-256、SHA-384、SHA-512,散列值长度分别是256bit、384bit、512bit。目前使用最广泛的散列函数(相对SHA-1比较安全)。
  • SHA-3

    • 全新标准

4.3. 如何防止数据被篡改

4.3.1. 案例一

如何确保两份文件是否一致(防止其他人修改)?

按照普通用户的思路,可能先把昨天的文件拷贝一份保存到安全的地方,第二天把保存的副本和源文件进行一一比对,如果比对通过就说明没有被修改过。

如果文件比较大而且比较多的情况下,文件比对的工作量就会非常大。如果使用单向散列函数对文件进行计算得出一个散列值,每次比较散列值是否相同就可以很快确认文件是否被修改。

4.3.2. 案例二

平时在下载内容的时候,有些官方网站会把相关内容的散列值告诉用户,方便用户确认从其他地方下载的内容是否被修改过。

散列函数的作用主要是为了防止数据被篡改。

五、数字签名

场景:Alice发送消息给Bob,Alice发的内容有可能是被篡改的,或者有人伪装成Alice发消息,或者就是Alice发的,但她可以否认。

问题:Bob如何确定这段消息的真实性?如何识别篡改、伪装、否认?

解决方案:数字签名。

在数字签名技术中,有以下2种行为:

  1. 生成签名:由消息的发送者完成,通过“签名密钥”生成。

  2. 验证签名:由消息的接收者完成,通过“验证密钥”验证。

在公钥密码中,任何人都可以使用公钥进行加密(如下图)。

在数字签名中,任何人都可以使用公钥验证签名(如下图)。

思考:如何能保证这个签名是消息发送者自己签的?

答案:用消息发送者的私钥进行签名

5.1. 数字签名和公钥密码

数字签名其实就是将公钥密码反过来使用。

注意:签名 ≠ 加密,通俗点说加密就是你哪怕看到了不该看到的东西,也理解不了。而签名就是你做了任何事,都抵赖不了。

5.2. 数字签名的过程

  1. Alice生成密钥对,提前把公钥给Bob;
  2. Alice用自己的私钥,把原消息内容和加密后的消息后发送给Bob;
  3. Bob收到签名后使用Alice的公钥进行解密;
  4. Bob将解密的消息和原消息内容进行比对,如果两者一致就代表签名验证成功。

上面的流程虽然没有问题,但是效率比较低。在Alice发送消息时,可以先将消息使用散列函数生成散列值,使用私钥对散列值进行签名,最终把消息和签名一起发送给Bob。Bob收到消息后使用Alice的公钥进行解密,得到消息的散列值后,和原消息的散列值进行比对就可以得知签名是否验证成功。

5.3. 疑惑

问题1:如果有人篡改了文件内容或者签名内容,会是什么结果?

解答:签名验证失败,证明内容会篡改。

问题2:数字签名不能保证机密性?

解答:数字签名的作用不是为了保证机密性,仅仅是为了能够识别内容有没有被篡改。

问题3:数字签名的作用是什么?

解答:确认消息的完整性(是否被篡改),防止消息发送人否认(公钥和私钥是一一对应的)。

5.4. 数字签名的问题

正确使用签名的前提是:用于验证签名的公钥必须属于真正的发送者。

如果遭遇了中间人攻击,那么公钥将是伪造的,数字签名将失效(如下图)。

因此在验证签名之前,首先得验证公钥的合法性(公钥是否属于真正的发送者)。如何验证公钥的合法性?证书。

六、证书

证书(Certificate),可能联想的是驾驶证、毕业证、英语四六级证等等,都是由权威机构认证的。密码学中的证书,全称叫公钥证书(Public-key Certificate,PKC),和驾驶证类似,里面有姓名、邮箱等个人信息,以及此人的公钥,并由认证机构(Certificate Authority,CA)施加数字签名。

CA就是能够认定公钥确实属于此人并能够生成数字签名的个人或者组织。有国际性组织、政府设立的组织,也有通过提供认证服务来盈利的企业,个人也可以成立认证机构。

变换理解:CA可以类比公安部(机构很安全),我们的身份证是公钥,出生或者办理身份证上传的指纹是私钥,公钥虽然不能完全保证你就是身份证本人,但是私钥一定可以匹配你就是身份证的所有者。每次需要证明你就是身份证本人的时候,到公安部进行申请验证,公安部出具一份证明材料并盖上公章(证书)就可以认定你就是身份证本人。