中间方攻击
在密钥协商阶段,通信双方都需要向对方提供密钥,拿DH密钥协商举例,客户端需要把自己的公钥发送给服务器端,服务器端把DH参数和服务器公钥发送给客户端,最终双方都持有对方的公钥拿来加密用,自己的私钥用来解密。RSA密钥协商也差不多,不过两种协商算法都有可能会遭到中间方攻击,导致密码套件泄露,来看个例子,在RSA密钥协商中,中间方是如何“获取”通信双方的密码套件的。
- RSA密钥协商,首先客户端向服务器端发送连接请求,希望服务器端回应并发送本次通信的RSA公钥。
- 中间方把客户端的连接请求截获,然后把自己的连接请求发送给服务器端,服务器端生成密钥对后,响应发送RSA公钥给中间方。
- 中间方保留服务器端公钥后,自己生成一个RSA密钥对,并把公钥发送给客户端,也就是把真正的服务器端公钥替换掉了。
- 客户端收到中间方的公钥后,误以为是服务器端公钥,继续进行密钥协商,通过随机数生成器生成了一个预备主密钥,并使用了中间方公钥对其进行机密,发送给服务器端。
- 中间方继续截获客户端发送的预备主密钥,用自己的私钥解密出预备主密钥后,再自己生成一个预备主密钥,用第一次或得到服务器端公钥加密,发送给服务器端。
- 服务器端接收到中间方发来的预备主密钥,并用自己的私钥解密,发现能正确解出预备主密钥,误以为密钥协商完成。
- 此时,客户端持有的是中间方公钥,服务器端持有的是中间方的预备主密钥,中间方却拥有服务器公钥和客户端生成的真正的预备主密钥,接下来中间方就可以随意伪造信息,同时不让通信双方发现,来看看它是怎么实现。
- 由于客户端持有的是中间方公钥,客户端使用它来加密信息,并发送给服务器,中间方截获密文后,因为拥有客户端生成的预备主密钥,可以知道客户端使用的加密算法,例如AES,解密出明文,最后再自己加密发送给服务器端。
- 由于服务器端持有的是中间方的预备主密钥,解密出的明文可能是被中间修改过的,到这一步,中间方攻击完成,通信双方的对话泄露了,同时存在消息被篡改的风险。