对于中间人攻击的一点想法
Ch.1 前文
这篇文章的想法最初是我看了V站上的一篇帖子:怎么在无安全信道的情况下抵抗中间人攻击。
现在的 ssl是因为有根证书担保,而根证书是预置在电脑里的。想问下,如果通讯双方没有预先协商任何内容且信道出入口完全被控制的情况下,还有没有办法抵抗中间人攻击。
那么在讲讲我的想法之前,先来回顾一下现代的证书体系是如何运作的。
Ch.2 证书体系
在说明这个体系如何运作之前,先来看看 Google 的证书长什么样:
可以看到一个证书里面包含了很多信息,包括颁发者
、有效期
、加密方式
等等信息,那证书是怎么来的呢?下面就来说一说现代证书体系有哪些角色以及他们各自的作用。
- 公钥(Public Key):由服务器公布,可以和对应的的私钥互相解密对方加密的数据。
- 私钥(Private Key):由服务器持有。
- 数字证书(Digital Certification):CA颁发的,由申请方的个人信息、公钥等,经过CA的私钥加密而来的一串数据。
- 证书授权中心(Certificate Authority):所有人公认的、具有公信力的、签发数字证书的部门。
以上面为例,假如你现在要访问https://www.google.com/
,Google的服务器会将它的数字证书
先传递过来,浏览器将校验这个证书是否有效,若验证通过,浏览器将从数字证书
中提取出公钥以并按照相应的加密算法将内容加密传输,至此完成(其实没有这么简单,有时候会双向校验,那些情况就更复杂了)。
在以上的过程中,要展开中间人攻击,则有几个部分需要完成:
- 截取Google服务器发的数据包,并将
数字证书
替换为自己掌握了私钥的证书。 - 确保这个证书能骗过浏览器的校验。
如果能做到上面两点,那么浏览器发送的数据将可被中间人用私钥解密,所有的数据都将暴露无遗。当然,做到第一步很简单,只需要改改数据包即可,要做到第二部就不是那么简单的事情了。为什么?因为有CA的存在。
如上面所说,CA做的事情就是将申请方的公钥用CA的私钥加密,而CA的公钥可以解密这些信息,并且CA是默认被所有人信任的。如此一来,只要CA保证签发的数字证书
是真实有效的,那么中间人将无法骗过浏览器。
这中间还有最后一个问题,CA是如何默认被所有人信赖的呢?
浏览器在被编写的过程中,会将几大CA厂商的证书写死在代码里,作为根证书
,而根证书
的颁发者就是根证书
本身,其他所有的数字证书都可以追根溯源到根证书
,这就是证书的互相信任关系,那么只要CA保持绝对的公信力,则所有证书将无法伪造。
可以再打开刚刚那个证书的详情,可以很明显的看到这一点。
Ch.3 如果没有CA的存在会怎么样
假如有这么一天,所有人将被一个邪恶的ZF统治,这个ZF强行控制了所有CA,那么事情将变得可怕起来,因为你将无法验证到底有没有人伪造CA的证书欺骗你。
那么在这个情况下,在不事先和你朋友B商量好、且仅知道B的IP地址的情况下,如何做到完美加密你要发送给他的信息,又能让他解密出你的信息呢?
其实这个问题和拜占庭将军问题
有一点类似,拜占庭问题是这样的:
在战争的时候,拜占庭军队内所有将军和副官必需达成一致的共识,决定是否有赢的机会才去攻打敌人的阵营。但是,军队可能有叛徒和敌军间谍,左右将军们的决定,扰乱军队整体的秩序。在进行共识时,结果并不代表大多数人的意见。这时候,在已知有成员谋反的情况下,其余忠诚的将军在不受叛徒的影响下如何达成一致的协议,拜占庭问题就此形成。
数学上已经证明拜占庭将军问题
在忠臣和奸臣的数量满足一定关系时可以解决,但是对于我们这个问题呢?
很遗憾,我认为是无解的。因为你不管发送了什么信息,只要有人能截获你的中间流量,那么这个人就完全可以伪造成B和你通信,再伪装成A与B通信,在没有事先和B商量好的情况下(即通过某种方式确认这份加密的数据确实是由B加密的),A是无论如何也不可能判定出有没有人伪造B与你通信的。
标签: 无标签