今天看了点关于公私钥加密的内容,赶快记下省的忘记了。
这里有几个概念:公钥,私钥,加密,认证,认证中心(CA),数字证书。
公钥和私钥是属于非对称性加密,公钥和私钥是完全不同的,但是相互对应的。一把私钥只能对应一把公钥。顾名思义,公钥是对外开放的,所有人都可以获得,私钥是自己保管的。
加密与认证
基于公钥的加密
加密的目的是保证密文只能由特定人读取,其他人都不能获知里面的内容。公钥的作用就是加密。举例说明:Alices发信息给Bob。她会用Bob给的公钥对明文进行加密。Bob得到密文后,用自己的私钥解密。这个过程保证即使其他人得到了密文也没法看。
图1
基于私钥的认证
私钥的作用是鉴别用户的真伪。还是上面的例子,Alices给Bob发信。但是Bob的公钥很多人都有,如何知道收到的信是Alices发的呢?就要靠私钥认证。Alices给Bob发信的时候可以附带一段信息,然后通过自己的私钥把这段信息加密。Bob收到信后,首先用Alices的公钥就附带信息进行解密,如果正确就说明这封信确实是Alices发的,然后再用自己的私钥解密信的具体内容。
图2
认证中心(CA)与数字证书
认证中心的作用是保证公钥的正确。比如:Alices想给Bob发一封绝密的信件,而此时,Alices和Bob都没有对方的公钥。这时,Bob给Alices的公钥,Alices如果知道是Bob给的而不是其他人冒充给的?怎么办?!这时就要CA出马了。Bob提交自己信息和公钥给CA。CA通过自己的私钥加密这些信息,生成一个数字证书。Bob把这个数字证书给Alices,Alices通过CA的公钥对数字证书解密,得到公钥就是Bob的公钥。
个人感觉非对称加密一个很重要的一环就是CA的作用。首先,CA要保证它的公钥不能被替换,否则都别玩了。这个估计不难,确定个网址,只有从这下载的才是CA的公钥。或是其他更高级的措施。其次,CA要保证对个人的认证。比如Tom提交个人信息和公钥后CA就要保证不能冒充为Bob的。这个估计靠人或其他措施,总之能保证。这些都是CA的事,我们不管。
图3
苹果的签名
重头戏来了,下面就说一下苹果的签名与上面的关系。搞了这么久的iOS开发,经常被开发中各种证书给搞晕,这真是一个大坑,但是不得不过。
一、数字签名(digital signature)
对指定信息使用哈希算法,得到一个固定长度的信息摘要,然后再使用 私钥 (注意必须是私钥)对该摘要加密,就得到了数字签名。所谓的代码签名就是这个意思。
二、数字证书(digital certificate)
证书生成
开发者在申请iOS开发证书时,需要通过keychain生成一个CSR文件(Certificate Signing Request),提交给苹果的 Apple Worldwide Developer Relations Certification Authority(WWDR)证书认证中心进行签名,最后从苹果官网下载并安装使用。这个过程中还会产生一个私钥,证书和私钥在keychain中得位置如图:
图4
证书组成
经过WWDR数字签名后的数字证书长这个样子:
其中包含两大部分:
· 证书本身
包含用户的公钥、用户个人信息、证书颁发机构信息、证书有效期等信息。
· 证书签名
WWDR将上述证书本身内容的使用哈希算法得到一个固定长度的信息摘要,然后使用自己的私钥对该信息摘要加密生成数字签名,整个过程如图所示:
证书使用
iOS系统原本就持有WWDR的公钥(这里就保证了CA公钥的正确性),系统首先会对证书内容通过指定的哈希算法计算得到一个信息摘要;然后使用WWDR的公钥对证书中包含的数字签名解密,从而得到经过WWDR的私钥加密过的信息摘要;最后对比两个信息摘要,如果内容相同就说明该证书可信。整个过程如图所示:
在验证了证书是可信的以后,iOS系统就可以获取到证书中包含的开发者的公钥,并使用该公钥来判断代码签名的可用性了。
证书存在的意义
通过证书使用过程可以看出,证书本身只是一个中间媒介,iOS系统对证书并不关心,它其实只想要证书中包含的开发者的公钥!!
但是开发者怎么才能证明公钥是自己的呢?iOS安全系统怎么才能相信这个公钥就是这个开发者的呢?
不管是哪一个开发者对iOS的安全系统说,这个公钥就是我的,系统是都不相信的,即系统对开发者有着百分之百的不信任感。但是iOS安全系统对自家的WWDR是可信任的,苹果将WWDR的公钥内置在了iOS系统中。有了证书,iOS安全系统只需要通过WWDR的公钥就可以获取到任何一个开发者的可信任的公钥了,这就是证书存在的意义!!
三、公钥(public key)
公钥被包含在数字证书里,数字证书又被包含在描述文件(Provisioning File)中,描述文件在应用被安装的时候会被拷贝到iOS设备中。
iOS安全系统通过证书就能够确定开发者身份,就能够通过从证书中获取到的公钥来验证开发者用该公钥对应的私钥签名后的代码、资源文件等有没有被更改破坏,最终确定应用能否合法的在iOS设备上合法运行。
四、私钥(private key)
每个证书(其实是公钥)都对应有一个私钥,
私钥会被用来对代码、资源文件等签名。只有开发证书和描述文件是没办法正常调试的,因为没有私钥根本无法签名。
五、provisioning profile的生成
还记得刚开始为了生成这玩意也费了很大劲。首先通过钥匙串生成一个csr文件,把这个文件提交给苹果开发中心,生成一个cer文件。其实这个过程就是把自己的公钥给Apple,至于上面提到的如果保证公钥的确定性,就靠进入开发中心的账号和密码了,如果这玩意泄露了,那就谁也无能为力。
下载安装cer文件后,就会在钥匙串中多出个选项,如图4所示。下面是自己的私钥,这个很重要。别问私钥存在哪,我也不知道,但是它能导出为p12文件。
cer搞定后就是在开发者中心添加appID,设备等,不详述了。 最后到生成provisioning profile。首先你要选类型,就是用于开发还是用于发布,其次是appID。下面的选项很重要,是选择certificates,这个就是选择你要包含的公钥,它是用来加密用的,我一般会都选。如果是开发的话,下面就是选择设备了,然后命个名就完事了。设计到加密的就是certificates的选择。
所以开发的时候私钥也就是P12文件和provisioning profile匹配是最重要的。私钥对代码进行加密,公钥解密。整个过程就是认证的过程,保证了,iOS设备安装的程序是经过苹果审核同意的。这也就是苹果费这么大劲的目的。
在Xcode6中codesing和provisioning配置都是可选择的,选择一定的匹配,否则要不是真机调不了,要不就是上传不成功。
简述一下整个过程:首先开发者上传csr文件,即把公钥给苹果。生成provisioning profile时选择对应的公钥。然后下载安装相应的provisioning文件。在程序打包时,会用私钥就代码进行加密,然后把provisioning文件包含到app文件中。当iOS设备安装应用时,首先用CA的公钥解密出开发者的公钥,然后再用开发者的公钥解密出代码,完成安装。
看来苹果为了保证代码的来源,也是蛮拼的!