微信号:infoqchina

介绍:有内容的技术社区媒体

保护好你的秘密

2013-12-03 21:50 InfoQ

在自由黑客和政府特工的两面夹击下,想要安全地交换数据很难。大多数安全数据交换都以公钥加密为基础,而公钥加密依赖于信任,可那些窃取数据的人都是滥用信任方面的专家。理应安全的连接也会被降级,安全级别和它最容易被攻破的薄弱点处于同一水平,并且即便最强的加密形式在私钥暴露后面对数据捕获和破解也非常脆弱。


但我们仍然有办法可以保护秘密,特别是在数据交换双方都可控的情况下。本文会介绍一些能够确保应用数据交换安全的办法,在眼下以及可预见的将来都能防止数据被泄露。还会给出应用安全技术的Java代码示例。此外你还将学会如何保护自己的在线访问。


信任管理机构


大多数数据交换都以公钥加密作为安全基础。公钥加密的基本原理是使用一对密钥,一把是需要绝对保密的私钥,一把是可以随意分发的公钥。这两把密钥要相互配合使用,任何持有公钥的人都可以对数据加密,而加密后的数据只能由持有私钥的你解密;并且你用私钥加密的数据只有持有公钥的人才能解密。


用公钥加密的作用很明显,因为这样其他人可以向你发送私密消息。而用私钥加密的作用不是那么显而易见,但它在保证安全方面的作用同样重要,因为它可以对消息签名。你能为任何你想发送的数据计算出一个安全摘要(一般是一个很难做逆向计算的哈希码),然后用私钥对摘要加密,并同时发送数据和经过加密的摘要。任何持有你的公钥的人都可以解密你发送的摘要,并在他们收到数据上重新计算摘要。这样他们既能确保他们收到的就是你发送的数据(如果摘要值相互匹配),又能保证确实是你发送的数据(因为用你的公钥解密了经过加密的摘要)。


公钥通常以证书的形式分发,也就是说它们会被封装在一个标明你是谁的信封内。这个信封由证书颁发机构签名,可以佐证你的身份。有些证书颁发机构是根机构,也就是说对他们自身的证书是可以直接信任的。其他机构用经由某些第三方机构签名的证书,形成了最终以某个根机构为基础的可信链条。


只要证书颁发机构完全值得信赖,这就是优秀的身份验证系统,所谓值得信赖是指证书颁发机构既要诚实又要够资格。在过去20年里出过一些事故,有些人能拿到冠以其他组织名称的证书,这表明某些机构达不到应有的资质水准。甚至还有更糟的情况出现,证书颁发机构本身都会受到损害,机构的密钥被盗,窃贼可以自己创建可信的证书。


Mozilla 产品 (包括Firefox) 用 166个受信根证书 表示至少70个不同的机构。看起来好像被授于这么高的信任程度的机构太多了,但这仅仅是冰山一角。还有很多机构凭借经由这些根机构签名的证书取得了信任,并且这种转授的信任还能扩展到更多层级。受信的证书颁发机构的总数量绝对数以百计,而且很可能有上千个 (没人真的知道,但 EFF SSL Observatory 在2010年从公共网站上找出了650多个)。


安全和中间人


所以浏览器(或者程序代码,比如在Java 7的标准版中有81个受信根证书)中有这么多受信的证书颁发机构签发证书。这是什么情况?


当用SSL协议(实际上是TLS,跟SSL原理相同的现代替代品)创建连接时,要依靠服务器提供的证书来保证初始数据交换的保密性。这个连接在到达服务器的路由中要经过一些中间介质,并且只要这些中间介质都是“诚实”可信的(即他们在往两边传输数据时都不会修改),那这个连接或多或少是安全的(我们后面再详细讨论或多或少)。


但如果中间介质中有一个不诚实,你就很容易遭受到中间人攻击。对TLS来说,最简单的中间人攻击是使用伪造的服务器证书,攻击者用由自己的私钥生成的证书冒充服务器的证书。狡诈的中间介质把这个伪造的证书发送到你的客户端,客户端就会连接到中间介质,然后中间介质再单独建立一个到服务器的安全连接。它在连接的两端中间转发数据,给你造成直接连接到服务器的假象。这样中间介质既可以看到你们发送的所有数据,也能根据需要篡改任何数据。


出现这种欺诈性中间介质的可能性有多大?很不幸,可能性非常大。路由器上经常会出现一些会被黑客(自由职业者或得到政府资助的人)攻陷的漏洞。信誉好的制造商在发现漏洞后会为路由器发布固件更新包,但我们大多数人不会更新家里或办公室里的路由器,所以它们可能会因为已知的问题被攻破。最近有报道暗示,路由器制造商在某些情况下甚至会故意在他们的路由器中制造后门 ,以方便政府部门访问(在美国讽刺性地指责中国制造商华为的所作所为中曾提到过)。


对企业级路由中的这类问题我们实在是无能为力,但对于家用和小型商用产品,我们可以用开源固件代替由制造商提供的固件。像DD-WRT、Tomato、OpenWrt 之类的可选项能在大多数有线和wifi路由器上使用,它们既有经过强化的功能,又可以保证你运行的开源代码至少有很多人看过(不能保证没有漏洞,但至少没有那种可能是故意植入的明显漏洞)。


在某些情况下(比如外交会议上的自由wifi访问),有些组织会故意使用欺诈性路由器,以便可以观察通过理应安全的连接交换的数据。规模更大的也有,互联网服务提供商可能会让政府直接访问他们的路由器。


即便控制不了路由器,坏蛋们有时也能用DNS欺骗实施中间人攻击。他们会用一个错误的主机IP地址迷惑DNS服务器,这个地址通常指向由坏蛋控制的系统。当你的客户端想要连接到某台主机时,它会要求DNS服务器提供这台主机的IP地址,而DNS服务器就会从它的缓冲池中取出(错误的)地址给你。然后你就连到了错误的系统上,它或者直接假装成你想要连接的系统,或者自己再建立一条到初始目标系统的连接,充当欺诈性的中间介质。


所以在你每次建立安全连接时,有些人可能已经潜入到了你和服务器之间的数据交换环节中。如果真能靠证书保证数据交换双方的身份,这不是什么大问题,可惜证书做不到啊。取得客户端信任的证书颁发机构有上百(或上千)个,其中一旦有一个发出了冒充你的目标主机的证书,那他们就全都会遭受到中间人攻击。只要想到证书颁发机构的发行被黑,或者在验证身份时犯了错误就觉得相当恐怖了,但还不止这样,你还要考虑到这些证书颁发机构中有很多或者在独裁政府的直接控制之下,或者会受到他们的恐吓。所以公共认证系统实际上已经出现了破损,尽管我们还有继续使用它的必要,但绝不能认为它是安全的。


***********************************

本文来自InfoQ微信公众账号:infoqchina

1、回复“今日新闻”,查看今天更新的新闻;

2、回复“今日英文”,查看今天英文站的更新;

3、回复“文章 +关键词”,搜索关键词相关内容;

4、回复“QCon”,了解QCon大会相关信息;

5、回复“活动”,了解最近InfoQ组织的线下沙龙;

6、回复“架构师”,获取《架构师》下载地址;

7、回复“投稿”,了解投稿和加入编辑团队的流程。

***********************************

 
InfoQ 更多文章 Facebook如何实现PB级别数据库自动化备份 学术派Google软件工程师Matt Welsh谈移动开发趋势 Spotify为什么要使用一些“无聊”的技术? 妹纸们放假了,汉纸们做啥? 大多数重构可以避免
猜您喜欢 R语言中常用的数学函数及简短的用例 PHP语言基础简单整理 是和VR抢蛋糕,还是配合VR分蛋糕? ——浅谈三维重建和应用 优化安卓应用内存的神秘方法以及背后的原理,一般人我不告诉他 敏捷破冰之旅(四)