IM聊天系统安全手段之传输内容端到端加密技术( 五 )

 
注:“||”代表连接符,比如 456 || 123 = 456123
但是 DH 这个密钥太长,不适合作为消息密钥,所以对这个初始密钥进行一次 KDF 计算,以衍生出固定长度的消息密钥 S:
 

S = KDF(DH1 || DH2 || DH3 || DH4)
 
这一步,Alice 终于计算出了消息密钥 S 。
于是:
 
  • 1)Alice 使用消息密钥 S 对消息进行加密,连同自己的身份公钥 IPK-A 和临时公钥 EPK-A 一同发给 Bob;
  • 2)Bob 收到 Alice 的信息后,取出 Alice 的 2 个公钥,连同自己的密钥,使用与 Alice 相同的算法计算消息密钥 S;
  • 3)Bob 和 Alice 使用消息密钥进行加密通讯 。
 
由上可知:X3DH 实际是复杂版的 DH 协议 。
至此:我们简单介绍了 Signal Protocol 中最为核心的 X3DH 协议与双棘轮算法,基本上可以满足前向安全和后向安全 。当然,真实的处理过程会更为复杂和安全 。
 
7、IM群聊的端到端加密方案 
在即时通讯场景中,除了二人之间的聊天以外,还有一个重要的场景就是群聊,那么群聊时的多人消息如何做端到端加密呢?
我们再次回到 DH 密钥协商算法上的推导过程:显然,多方情况下依然可以继续使用 DH 密钥协商算法,这就是群聊中端到端加密的基础 。
而 Signal Protocol 在群组聊天中的设计与二人聊天又有所不同,由于群聊的保密性要求相对低一些,只采用了 KDF 链棘轮+公钥签名来进行加密通讯以保障加密的前向安全 。
群组聊天的加解密通讯流程如下:
 
  • 1)每个群组成员都要首先生成随机 32 字节的 KDF 链密钥(Chain Key),用于生成消息密钥,以保障消息密钥的前向安全性,同时还要生成一个随机 Curve25519 签名密钥对,用于消息签名;
  • 2)每个群组成员用向其它成员单独加密发送链密钥(Chain Key)和签名公钥 。此时每一个成员都拥有群内所有成员的链密钥和签名公钥;
  • 3)当一名成员发送消息时,首先用 KDF 链棘轮算法生成的消息密钥加密消息,然后使用私钥签名,再将消息发给服务器,由服务器发送给其它成员;
  • 4)其它成员收到加密消息后,首先使用发送人的签名公钥验证,验证成功后,使用相应的链密钥生成消息密钥,并用消息密钥解密;
  • 5)当群组成员离开时,所有的群组成员都清除自己链密钥和签名公钥并重新生成,再次单独发给每一位成员 。这样操作,离开的成员就无法查看群组内的消息了 。
 
由上可知:一个人在不同的群组里,会生成不同的链密钥和签名密钥对,以保障群组之间的隔离 。在每个群组中,每个成员还要存储其它成员的 KDF 链和签名公钥,如果群组成员过多,加解密运算量非常大,会影响发送和接收速度,同时密钥管理数据库也会非常大,读取效率也会降低 。
所以:群组聊天使用 Signal Protocol 协议,群人数不宜太多 。
 
8、端到端加密方案的补充说明 
上面我们介绍了即时通信中二人聊天和群组聊天的端到端加密全部过程 。但是正常情况下端到端消息加密只是加密消息的实际负载部分(即只加密消息“体”部分),而消息的控制层则不会被加密,因为消息转发服务器需要根据控制信息进行消息转发或路由(否则肯定大大影响IM底层的路由和通信效率,因为需要反复加密解密) 。
为了防止消息被定向分析(分析用户什么时间向谁发送了消息,或接收了谁的消息),我们依然需要对整体即时通信的长连接链路进行加密保护(这说的就是上篇文章里的通信连接层加密技术了),防止信息被中间网络设备截获并分析 。而且为了防止密钥服务器被中间人攻击,也需要开启链路加密保护 。
 
9、参考资料 
[1] 移动端安全通信的利器——端到端加密(E2EE)技术详解
[2] 简述实时音视频聊天中端到端加密(E2EE)的工作原理
[3] HASH、MAC、HMAC学习
[4] 一文了解加解密、哈希函数、MAC、数字签名、证书、CA等
[5] 双棘轮算法:端对端加密安全协议,原理以及流程详解
[6] Signal protocol 开源协议理解
[7] X25519(Curve25519)椭圆曲线参考资料
(本文已同步发布于:http://www.52im.net/thread-4026-1-1.html)




推荐阅读