RSA、Diffie-Hellman和中间人攻击

背景

网络上常常有对RSA、DH算法,以及中间人攻击的讨论。
一种说法是“RSA密钥协商(交换)不会受到中间人攻击”,听起来似乎RSA比DH做密钥协商更优。
这种说法有些不负责任。下面把这个问题中涉及到的概念都解释一下,再来看这个问题。

中间人攻击 MITM

(MITM) is an attack where the attacker secretly relays and possibly alters the communication between two parties who believe they are directly communicating with each other.

中间人攻击,可以这样解释:攻击者一定程度上控制了网络,成为网络双方通信的中间者,从而获取到双方的通信信息;而通信双方都感知不到中间人的存在。
这个话题往往和加密通信一起讨论:如果加密信道中存在中间人,那明文就会被中间人获取,而通信双方还不会知晓。

中间人攻击的根本,在于通信双方没有进行身份认证。即:不知道和自己直接通信的人是谁。如果双方能确认直接通信的人就是对方,也就不存在中间人攻击了。

RSA加密算法

RSA加密算法是一种非对称加密技术。由一对密钥(公钥+私钥)组成。
可以利用私钥来生成公钥。

一般来说,私钥会被秘密保存起来,而公钥则分发出去。

公钥加密,私钥解密,称为RSA加密算法。是为了保证公钥加密的内容,只有私钥持有者可以解密。常常用在客户端账密登录过程:客户端对密码进行公钥加密,发送到服务端后用私钥解密,这样即使请求被截获也不会泄露密码(实际上要更复杂一些)。

私钥加密,公钥解密,称为RSA签名算法。是为了保证公钥持有者获取的内容,确实是来自私钥持有者的正确内容。比如服务器持有私钥,将一个重要信息计算hash再私钥签名后,和信息本身一起发送到客户端;客户端用公钥解密签名得到hash值,再计算信息的hash值,进行比对,就知道内容是否被篡改。由于私钥的保密性,攻击者无法伪造有效的签名。

DH密钥交换算法

DH密钥交换算法并不是加密算法,而是双方在不安全的网络中交换信息而生成双方仅有的密钥的一种方法。其结果是,交换的双方得到了一样的会话密钥,而其他任何人不能得到这个密钥。
由于算法的结果是通信双方拥有了一样的密钥,双方往往会利用这个密钥进行对称加密通信。

DH算法的过程可以简单解释如下:通信双方AB,各自生成一对DH密钥(Pa,Sa)和(Pb,Sb)(P代表公钥,S代表私钥)。双方交换各自的公钥P,于是A持有Sa、Pb,B持有Sb、Pa。通过某种计算,Sa、Pb可以生成会话密钥K,Sb、Pa也可以生成相同的K。

DH的问题:中间人攻击

DH算法本身不包含身份认证机制,所以中间人攻击是其明显的问题。
设想:
在AB间,有一C。AB交换DH公钥P时,C在中间截获;C自己生成一对DH密钥(Pc,Sc),用Pc和A、B完成密钥交换。于是C与A间有了会话密钥Kac=f(Pa,Sc)=f(Pc, Sa),C与B间有了会话密钥Kcb=f(Pb,Sc)=f(Pc, Sb)。只要C从一方获得的信息,重新加密后传递给另一方,AB就都不会发现他们的通信被劫持了。

RSA密钥协商

密钥协商(key establishment)包括“密钥传输”(key transmission)和“密钥交换”(key exchange)。

所谓RSA密钥协商实际是密钥传输,即一方生成密钥,传递给另一方,而不必双方交换。
具体来说,就是A自己生成一个密钥K,用自己的RSA公钥加密,再传递给B;B用RSA私钥解密得到K。仅就这个过程而言,不会存在中间人攻击。

但是这不是说RSA就比DH就更安全了。设想上面的情况,必须先要令A持有RSA公钥,B持有RSA私钥。这首先先进行一次RSA公钥传递,而这个传递过程是存在中间人攻击的。

设想:
B生成一对RSA密钥Pb、Sb,将公钥Pb发送给A。而AB中有C。C截获了Pb,而自己生成了一对RSA密钥Pc、Sc,将Pc发送给A。
A用Pc加密了会话密钥K,发送给B,被C截获。C用Sc解密得到K,再用Pb加密后给B。这时C完成了中间人攻击。

所以说:RSA的公钥在端与端间传递时,存在中间人攻击问题。

RSA最好的使用场景在服务端/客户端之间,服务端持有私钥,客户端直接内置好公钥,就不用担心中间人攻击了。

HTTPS中的中间人攻击

平时我们使用的,号称安全的https协议,也存在中间人攻击问题。比如Fiddler这种抓包软件,就能充当https通信中的中间人。
一般上网时使用的https是单向认证,即客户端通过CA认证服务器持有有效证书,来确认其身份。服务器不会验证客户端的身份。

如果使用双向认证,通过CA确认两端的身份都是正确的,就可以防止中间人攻击了。这种双向认证一般出现在企业应用对接中。

RSA公钥交换:非端到端加密

网络上有这样一种说法:
通信两端交换RSA公钥,通过对方公钥加密数据,自己私钥解密。这样就实现了端到端加密。

实际上这不是端到端加密。因为不能保证服务器无法修改数据:服务器可以用公钥来加密任何的数据发给两端。

而且,按之前所说的,这种交换,存在中间人攻击问题

你可能感兴趣的:(RSA、Diffie-Hellman和中间人攻击)