delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

27 Jan 2010

端到端(End to End)加密与安全

说明:这篇文章希望能够以比较通俗的方式介绍一下相关的概念。

端到端加密,通常是指两个通信实体之间在会话通道基础上进行的、由两个实体之间协商的密文会话。端到端加密的好处是能够减少会话通道本身的泄密或其他问题导致两个通信实体之间的通讯遭到第三方破译,并避免通讯的对方对通讯内容抵赖(即,不承认通讯内容来自自己)。相对而言,端到端加密的实施成本要比单独架设一条物理的通讯线路要便宜许多,因此有时它也用于架设这类通讯线路。端到端加密本身不能阻止由于使用的会话通道本身的丢包导致的干扰。然而,由于端到端加密可以工作在较高的抽象层次上,它可以使用多个实际的会话通道而提高抗干扰能力。

通常我们会希望在一个安全系统中设置多个层次的安全设施,或者说类似"洋葱"的模型,例如,在系统中,将所有与安全有关的信息记录日志并放到不可擦除的介质上、对连接进行加密,和对发送的消息进行加密,这几种方法分别考虑的是不同级别的信息安全,而这些方法可以在同一个安全系统中作为其不同的保护层次来使用。在这一类模型中,我们不仅视阻止入侵为目标,同时也将检测入侵做为目标,或者换言之,每攻破系统中的一个层次,入侵者都需要付出额外的努力,并冒更大的被发现的风险才能达到这样的目标。

以邮件系统为例,传统的电子邮件系统是完全不使用任何加密或签名的手段的。拥有接入层控制权的网络管理员,可以轻易地通过在网络上监听数据包来获知用户与自己所使用的邮件服务器之间交换的邮件内容。随后,当邮件到达了邮件服务器时,邮件服务器管理员也可以很容易地知道邮件内容;在邮件服务器将邮件传送到互联网上的另一台邮件服务器时,问题就更多了,每一跳路由,以及它们所经过的所有网络都可以被监听,并将邮件内容泄漏出去;最后,在另一台服务器和收件人之间,也有和发件人这一边一样的风险。

在Internet上传输电子邮件的过程,由于其经过的环节众多,并且几乎完全不受收发邮件的双方控制,因此很容易导致一些敏感信息的泄露。针对这种问题,人们设计出了一种叫做Transport Layer Security(TLS,用于替代SSL)的密码学协议来实现服务器之间,以及客户端到服务器的端到端安全。简而言之,这套协议首先使用公钥加密算法在通讯双方之间协商一个会话密钥,并用这个密钥完成之后的通讯加密/解密。公钥加密算法是一种加密和解密时使用不同密钥的加密算法,以对方公开密钥加密的数据,只能以(不公开的)解密密钥解密,而从公开密钥或已知明文、密文推算出解密密钥的代价非常大,因此它能够确保数据只能被"正确的"那个接收方解密。

这种密码学协议的实现包括两件事:发起会话的一端需要生成一个随机的"会话密钥",并以安全的方式(通过公钥加密)发给对方,而双方在稍后的通讯中,则以这个协商好的密钥进行对称加密(加密、解密使用同一个密钥,这种方法性能较好)对会话信息进行加密和揭秘。这样做除了性能方面的考虑之外,还有一个很 重要的是因为发起会话的这一方很可能没有自己的密钥对(公钥+私钥),由于对方的公钥公开,对方使用私钥对数据进行的处理只能看作是"签名"(可以使用公钥来进行验证)而不能作为传回数据时加密之用。这样,在建立加密会话时,接受会话请求的那一方很可能无法知道发起会话的那一方的身份(TLS事实上支持以包含公钥的证书的方式来验证身份,然而由于部署比较困难的原因,这一方法并没有得到非常广泛的使用,而只应用于一些强调安全而非易用性的场合)。

实施了TLS之后(由于兼容方面的考虑,通讯双方都需要启用TLS,否则邮件系统仍会以不加密的方式传输邮件),邮件系统在网络这个层次就无法被截获了。然而,这样做并不能阻止服务器端的管理员查看邮件的内容。我们注意到,在收发邮件时,实际上是两个人(当然,如果深究的话,事实上是代理他们的本地桌面终端)之间的端到端通讯,因此,在这里还应再进行一次端到端加密,使用PGP或S/MIME。这两种方法和前面所说的方法类似,但通讯双方均持有公钥/私钥对,使用自己的私钥来进行签名和解密,而对方的公钥则用于加密和验证对方签名,但在信任方式上则存在不同。S/MIME的信任关系依赖于各级发证机构(CA)所签署的身份证明,而PGP的信任关系则依赖于不同的个人之间对对方公钥进行的签名。S/MIME比较适合在企业内部迅速建立一套验证体系,而PGP则比较接近社会的关系,例如某甲是一个非常值得信赖的人,某乙、某丙虽然有时候满嘴跑龙套,但是还算靠谱,某丁则只有自己说话时候可以算数,说别人的事情的时候全是八卦,在PGP里面可以比较容易地对这些状态予以表达,并据此算出是否应信任某个签名。

说到这里,我们还必须强调一下端到端加密的缺点。首先,端到端加密只能提高通讯内容的保密性,它不能阻止通讯被彻底中断;然后是,端到端加密时,通讯双方的地址必须是公开的。这就好比通过快递公司去发运一个上了锁的保险柜一样,快递公司也许没有办法打开保险柜,但是保险柜本身并不能保证快递公司一定会把它送到目的地,而且,快递公司也必须知道发货人和收货人是谁,才能完成这趟物流。对于有更高保密需求的应用环境,还必须与其他层次的端到端加密结合,才能够达到所希望的效果。