理解
先给E2EE下一个定义:
End to end implies that the communication between the two endpoints (clients) is encrypted. The whole idea is that the server can never read or modify the conversation data.
关键在于“服务器永远不能读取或更改通讯数据”。
设想一种方案:
两台设备生成RSA密钥对。
通过服务器,两台设备交换RSA公钥。
双方使用对方传递过来的RSA公钥,对要发送的消息进行非对称加密,再通过服务器发送。
接收到来自对方的信息后,用自己的RSA私钥解密。
看起来,只有公钥经过了服务器,私钥都好好的保存在设备上;服务器或攻击者都得不到私钥,无法解密。很不错,不是么?
实际上,上面这种方案,不是端对端加密。
因为无法保证服务器没有更改信息内容。服务器或攻击者可以使用其获取到的公钥,伪造任何数据,传递给设备;设备都可以解密,且无法验证信息是否来源真实。
实现
Diffie-Hellman密钥交换算法
绝大部分E2EE实现都需要利用DH算法进行密钥交换。
介绍:Wiki。
特别说明:DH算法的安全性来源于其计算复杂度,随着计算机算力增强,最终会被淘汰(只要初始素数够大,在量子计算机出现前还是安全的)。
DH算法的漏洞:MITM中间人攻击
假设攻击者对网络有一定控制权限,他就可以截获DH算法密钥交换的公钥,转而自己生成成对密钥,将自己的公钥交换给通信双方。这样,通信双方实际上通过中间人进行信息中转。
这个问题是可以避免的,通常是通过对交换的公钥进行鉴别。
具体鉴别的方法在其他文章中给出。