本文由融云技术团队分享,原题“互联网通信安全之端到端加密技术”,内容有较多修订和改动。
1)引言
2)系列文章
3)为什么需要端到端加密?
4)端到端加密的技术设计思路
4.1 简化版思路
4.2 如何安全地传递用于消息加解密的密钥
4.3 采用共享密钥的原因
5)端到端加密的初步实践方案
6)端到端加密实践方案的进一步优化和演进
6.1 使用HMAC作为消息完整性认证算法
6.2 使用ECDH算法替换DH算法
6.3 提升前向安全性
6.4 同时保证前向安全和后向安全性
6.5 更安全的密钥交换协议—— X3DH
7)IM群聊的端到端加密方案
8)端到端加密方案的补充说明
9)参考资料
《移动端安全通信的利器——端到端加密(E2EE)技术详解》
《简述实时音视频聊天中端到端加密(E2EE)的工作原理》
说到端到端加密,我们首先想到的解决方案是:在发送端发送消息前对整个消息进行加密,接收端接收到消息后进行解密。
如上这样:消息中转服务器就无法获取我们的消息内容了。
事实上:这确实是端到端加密中消息收发的简化版解决方案,只是我们在实际应用中要更加复杂,效果也更加安全。
对于端到端加密,我们需要先解决的前置安全问题是:如何安全地传递用于消息加解密的密钥。
答案是:用非对称加密的方式传输密钥(与 SSL / TLS 中安全交换密钥的方式类似)。
非对称加密传输对称加密密钥的算法,一般归结两种方式:
1)一种是以 RSA、ECC 等为主(公钥加密私钥解密的方式,本质是加解密的算法);
2)另一种是以 DH、ECDH 为主的生成共享密钥的方式(本质是通过计算协商一个共同的密钥而不是加解密算法)。
实际上:大部分即时通信软件中的端到端加密都采用生成共享密钥的方式来传输会话密钥。这是为什么呢?
这就涉及到 DH 算法(即 Diffie-Hellman 密钥交换算法),关于DH算法的资料,有兴趣可以详读《Diffie-Hellman密钥协商算法》,限于篇幅,这里不专门讨论。
Diffie-Hellman 密钥交换算法的安全性依赖于这样一个事实:虽然计算以一个素数为模的指数相对容易,但计算离散对数却很困难。对于大的素数,计算出离散对数几乎是不可能的。
这里简要描述一下 DH 共享密钥的过程如下:
(其中“密钥 S”即为最终的共享密钥)
端到端加密采用共享密钥的方式来传输会话密钥有如下几个原因:
1)如果采用 RSA、ECC 等公钥加密私钥解密的方式传输密钥,需要在创建会话时生成临时密钥,并通过对方公钥加密后传输到接收端。
这就需要完全保证消息的可靠性,如果该消息在任何一个环节中丢失或损坏,则后续通信都无法进行。或者,需要采用更为可靠的传输方案,通常做法为需要接收端在线,通过各种确认来保证这个可靠性。
而采用共享密钥的方式则只需要知道对方的公钥,就可以完成生成共享密钥,并不一定需要对方在线。
2)如果已经生成的临时对称密钥丢失,则需要重新协商密钥。而采用共享密钥的方式则只需要知道对方的公钥,就可以完成生成共享密钥,不需要重新协商。
3)采用公钥加密私钥解密的方式至少会比生成共享密钥方式多一次交换对称密钥的通信过程。
4)密钥协商方式,不仅仅可以完成两个点之间的密钥协商,还可以延展到多人之间的共同协商出相同的密钥,这样能满足多人群体沟通的需求。
我们结合对于 DH 算法(即 Diffie-Hellman 密钥交换算法)这种共享密钥方式的认知(即公钥可随意公开),先设计一个简单的端到端消息加密的过程。
这个过程的逻辑流程如下:
1)在客户端 APP 首次安装时,基于服务器公开的两个全局的参数,生成自己的 DH 公钥和私钥;
2)将自己的公钥上传证书服务器,证书服务器上保存用户标识与其公钥的关系。私钥则保存在客户端上;
3)首次给对方发送消息或首次接收到对方消息时,便到证书服务器查询对方的公钥;
4)根据对方公钥和自己的私钥计算出共享密钥;
5)后续与对方所有的消息都基于这个密钥和相同的对称加解密算法进行加密解密操作。
端到端消息加密过程示意:
至此:我们完成了一个简单的端到端消息加密方案,在这个方案中我们引入了一个第三方的用于存储用户公钥的角色,这个角色的存在可以让任何一方都不用关心对方的在线状态,随时给对方发送加密过消息,而消息转发服务器无法解密消息。
接下来,我们针对这个简单方案存在的各种安全隐患问题,进行逐步分析和优化。
[1] 移动端安全通信的利器——端到端加密(E2EE)技术详解
http://www.52im.net/thread-764-1-1.html
[2] 简述实时音视频聊天中端到端加密(E2EE)的工作原理
http://www.52im.net/thread-763-1-1.html
[3] HASH、MAC、HMAC学习
https://blog.csdn.net/weixin_39467231/article/details/119222342
[4] 一文了解加解密、哈希函数、MAC、数字签名、证书、CA等
https://blog.csdn.net/MARS_098/article/details/123326723
[5] 双棘轮算法:端对端加密安全协议,原理以及流程详解
https://www.jianshu.com/p/0161c2733aee
[6] Signal protocol 开源协议理解
https://blog.csdn.net/andylau00j/article/details/82870841
[7] X25519(Curve25519)椭圆曲线参考资料
https://www.jianshu.com/p/5dba044f67b1
即时通讯网(52im.net)社区链接:http://www.52im.net/thread-4026-1-1.html,或点击下文的“阅读原文”!