程序员iOS OC 学习手册

iOS代码签名机制分析(1)基础

2016-04-13  本文已影响394人  小武的技术渔场

基础知识介绍会结合OpenSSL命令行工具实践,iMac环境可以使用brew或其它方式安装OpenSSL工具。

一,整个互联网世界的安全基石。

整个互联网的安全基石目前来说,个人认为是“非对称加密算法”+“信息摘要算法”+“数字证书机制”,对于开发并运行在iOS系统上的App程序来说,苹果公司也是采取以上方式来保证iOS系统上运行的App的合法性。因此,第一章节会介绍以上三种技术。

1,非对称加密算法。

一般传统的加密方式,通信的双发均需要知晓加密的方法和密钥,在相同规则下,对明文进行加解密。典型案例就是常见的谍战片里面,使用圣经的单词序加解密、数学运算规则加解密等。这样的方式常见的问题就是通信双方都必须掌握到密钥,有可能存在密钥在交换途中被截获,或者被有明文和密文的破解。
因为数论理论而发明的非对称加密算法很好的解决了对称加密算法的问题。非对称加密的密钥有两个,一个私钥,一个公钥。私钥仅能发信者自己持有,公钥可以四处传播,任何想和你加密通信的人,都可以使用公钥加密,将密文传递给你,你可以通过私钥来解密读取密文。
通过公钥,是无法计算出私钥的(或者说现有计算能力需要很长时间才能破解,配合一定的安全策略,如定期更换密钥就可以规避)。RSA加密算法是目前广泛使用的非对称加密算法,一般RSA算法私钥的二进制位数超过1024位,现有计算能力的计算机需要超过几十年才能通过公钥来找到私钥。
openssl工具能够帮助我们生成RSA的公钥和私钥,我们通过一个实验来看看如何使用公钥和私钥加解密明文。在安装了openssl命令行工具的shell下面,执行下面的操作,对sign.txt文本明文进行加解密操作:
(1)首先,使用openssl生成RSA的1024位二进制私钥apri.key

#openssl genrsa -out apri.key 1024

(2)然后,openssl使用私有代码生成对应的共钥apub.key

#openssl rsa -in apri.key -pubout -out apub.key

(3)公钥一般发送给别人,让别人使用公钥加密,这里使用公钥加密sign.txt,密文sign.en。

#openssl rsautl -encrypt -in sign.txt -inkey apub.key -pubin -out sign.en

(4)密文sign.en可以通过私钥解密,得到明文sign.de。

#openssl rsautl -decrypt-in sign.en -inkey apri.key -out sign.de

2,信息摘要算法。

根据百度百科的说明

“摘要算法是一种能产生特殊输出格式的算法,这种算法的特点是:无论用户输入什么长度的原始数据,经过计算后输出的密文都是固定长度的,这种算法的原理是根据一定的运算规则对原数据进行某种形式的提取,这种提取就是摘要,被摘要的数据内容与原数据有密切联系,只要原数据稍有改变,输出的“摘要”便完全不同,因此,基于这种原理的算法便能对数据完整性提供较为健全的保障。但是,由于输出的密文是提取原数据经过处理的定长值,所以它已经不能还原为原数据,即消息摘要算法是不可逆的,理论上无法通过反向运算取得原数据内容,因此它通常只能被用来做数据完整性验证。”

你只用了解两点
(1)输入源的长短可以不同,输出摘要信息长度相同。
(2)不同输入源对应不同的摘要信息。

因此,对于明文,摘要信息可以做为传输后的校验使用。我们利用openssl工具,同样来看看信息摘要算法:

//实际使用的sha1算法,从任何长度的文笔中,取得唯一的定长摘要信息sign.sha:
#openssl dgst -sha1 -out sign.sha sign.txt

如果我们修改了sign.txt的内容,重复执行以上命令,那么将得到不同的sign.sha。

3,数字证书。

数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名。
简单来说,证书就是证明非对称算法里的公钥的合法性,这一合法性,由发证机构来保证(技术保证和管理保证)。我们只要使用合法数字证书上的公钥,和证书里公钥拥有者进行通信的话,就保证了这一通信通路的安全和可靠。关于数字证书的详细技术细节这里不多做介绍,读者可以根据非对称加密,信息摘要算法的知识去学习了解证书的合法性技术保证过程。苹果系统通过keychain应用来管理数字证书。

二,iOS APP的代码签名机制。

这一章首先会介绍一下数字签名机制,然后会介绍下iOS里面的代码签名机制。这里面会使用到第一章里面的知识和概念,请读者先保证第一章熟练掌握的情况下,再进入这一章节的实践和学习。

1,数字签名机制。

数字签名实际上由两个过程组成,发送方签名过程和接收方验签过程。这两个过程使用了上面介绍的非对称加密算法和信息摘要算法来实现。目的,就是保证发送方信息的完整性和真实性(没有被中间者攻击所伪造)。通过下图数字签名过程图解,我们可以看看详细的过程:

数字签名的过程

(1)发送方对于发送的信息进行签名的过程。图中蓝色框里的发送信息,我们首先做信息摘要算法,计算出一个固定长度的摘要信息,然后使用非对称加密算法的持有的私钥进行加密(注意,这里是私钥加密,与信息传递过程私钥解密是不一样的),得到加密后的数字签名信息。

(2)该数字签名信息和发送信息一起发送给接收方进行数字验证签名过程。接收方使用非对称加密的公钥对数字签名信息进行解密,得到D‘,然后对发送过来的信息进行信息摘要,得到D。比对D和D‘,如果一致,就证明签名通过。

以上过程,保证了发送的信息在传播过程中,没有发生变化或者被替换。我们同样可以使用openssl工具来模拟这一过程,我们继续使用第一章介绍的RSA加密得到的公钥和私钥进行试验:

// 1 首先,使用私钥apri.key对信息摘要sign.sha进行签名加密得到signature.bin。
#openssl rsautl -sign -inkey apri.key -in sign.sha -out signature.bin

// 2 然后,使用公钥apub.key对加密后的密文进行验签,会解密出摘要sign2.sha。
#openssl rsautl -verify -pubin -inkey apub.key -in signature.bin -out sign2.sha

// 3 最后,使用diff工具,比对一下前后两个摘要是否一致。
#diff sign.sha sign2.sha 

2,iOS的代码签名机制。

iOS系统使用数字签名机制保证了运行在iOS系统中代码的合法性和完整性。当使用XCode开发环境,编写好APP后。所有的代码或者图片素材就是我们需要签名的信息源,我们使用摘要算法对这些信息源进行摘要,然后使用私钥对这些签名进行签名。这些程序和素材资源经过签名后会和公钥一起打包成ipa包,在iOS系统载入运行的时候,使用公钥对程序和素材验签,保证程序和信息的合法和完整,通过之后就能够在iOS上运行了。这就是iOS的代码签名机制。
读完以上的话,请稍微冷静的思考一下,上面描述的这段过程所存在的问题。
(1)RSA的公钥和私钥从何而来?
(2)iOS设备如何保证该公钥和私钥有权限对代码进行签名和验签操作?

请结合苹果的开发者证书获取过程,来思考下iOS代码签名的过程,及以上两个问题的答案,在本系列的第二篇文章会给出详细解答和描述,这里考察下读者的自学和专研能力。

上一篇下一篇

猜你喜欢

热点阅读