互联网通讯技能的发展运用,让信息无远弗届,衔接随时产生。关注【融云全球互联网通讯云】了解更多

但与此一起,互联网通讯也暴露出了一系列安全问题。咱们需求有针对性地运用相关安全技能,增强通讯体系的安全性和可靠性,为维护用户个人信息安全筑起防护墙。

在_融云互联网通讯安全系列文章首篇“链路安全”_中,咱们介绍了关于链路加密的相关技能和实践。在传输即时通讯音讯时启用 TLS 链路加密,确保音讯在到达服务器前无法被偷听和篡改;运用 CA 认证机制,杜绝中间人进犯。

这些都是提高客户端到服务器之间数据传输安全性的有效办法,可是未能处理用户间通讯隐私性和安全性面临的危险问题。由于在将数据传输到服务器之后,一切有权拜访此服务器的人,包括职工、相关供应商及其他有关人员甚至黑客,都有或许读取到用户的数据。

因而,端到端加密技能被大力推进,其呈现后很快被大众所认知并承受。在 WhatsApp、Signal、Telegram 等即时通讯软件中都有所运用。

今日,咱们同享互联网通讯安全系列文章的第三篇,带领咱们一文读懂端到端音讯加密

端到端加密计划规划思路

说到端到端加密,咱们首要想到的处理计划是,在发送端发送音讯前对整个音讯进行加密,接纳端接纳到音讯后进行解密。这样,音讯中转服务器就无法获取咱们的音讯内容了。

现实上,这确实是端到端加密中音讯收发的简化版处理计划,仅仅咱们在实践运用中要更加杂乱,效果也更加安全。

咱们需求先处理的前置问题是,怎么安全地传递用于音讯加解密的密钥。

答案是用非对称加密的办法传输密钥,与 SSL / TLS 中安全交流密钥的办法相似。

非对称加密传输对称加密密钥的算法,一般归结两种办法:一种是以 RSA、ECC 等为主的,公钥加密私钥解密的办法,实质是加解密的算法;另一种是以 DH、ECDH 为主的生成同享密钥的办法,实质是经过核算洽谈一个一起的密钥而不是加解密算法

大部分即时通讯软件中的端到端加密都选用生成同享密钥的办法来传输会话密钥。这是为什么呢?

此处为了便利理解,附上 DH 算法介绍:

根据原根的定义及性质,能够定义 Diffie-Hellman 密钥交流算法。该算法描绘如下:

1. 有两个大局揭露的参数,一个素数 q 和一个整数 a, a 是 q 的一个原根。

2. 假设用户 A 和 B 希望交流一个密钥,用户 A 挑选一个作为私有密钥的随机数 XA(XA<q)< span=””>,并核算揭露密钥 YA=a^XA mod q。A 对 XA 的值保密寄存而使 YA 能被 B 揭露取得。相似地,用户 B 挑选一个私有的随机数 XB<q< span=””>,并核算揭露密钥 YB=a^XB mod q。B 对 XB 的值保密寄存而使 YB 能被 A 揭露取得。

3. 用户 A 产生同享隐隐秘钥的核算办法是 K = (YB)^XA mod q。相同,用户 B 产生同享隐隐秘钥的核算是 K = (YA)^XB mod q。这两个核算产生相同的成果。

推导进程如下:

K = (YB)^XA mod q

= (a^XB mod q)^XA mod q

= (a^XB)^XA mod q (依据取模运算规则得到)

= a^(XBXA) mod q

= (a^XA)^XB mod q

= (a^XA mod q)^XB mod q

= (YA)^XB mod q

因而相当于两边现已交流了一个相同的隐隐秘钥。

4. 由于 XA 和 XB 是保密的,一个敌对方能够利用的参数只要 q,a,YA 和 YB。因而敌对方被迫取离散对数来确定密钥。例如,要获取用户 B 的隐隐秘钥,敌对方必须先核算 XB,然后再运用用户 B 选用的相同办法核算其隐隐秘钥 K。

Diffie-Hellman 密钥交流算法的安全性依赖于这样一个现实:尽管核算以一个素数为模的指数相对容易,但核算离散对数却很困难。关于大的素数,核算出离散对数几乎是不或许的。

简要描绘一下 DH 同享密钥的进程如下:

融云互联网通信安全系列之端到端加密技术

其中“密钥 S”即为终究的同享密钥。

总结而言,端到端加密选用生成同享密钥的办法来传输会话密钥有如下几个原因:

1. 假如选用 RSA、ECC 等公钥加密私钥解密的办法传输密钥,需求在创立会话时生成暂时密钥,并经过对方公钥加密后传输到接纳端。这就需求彻底确保音讯的可靠性,假如该音讯在任何一个环节中丢掉或损坏,则后续通讯都无法进行。或许,需求选用更为可靠的传输计划,一般做法为需求接纳端在线,经过各种确认来确保这个可靠性。而选用同享密钥的办法则只需求知道对方的公钥,就能够完结生成同享密钥,并不一定需求对方在线

2. 假如现已生成的暂时对称密钥丢掉,则需求重新洽谈密钥。而选用同享密钥的办法则只需求知道对方的公钥,就能够完结生成同享密钥,不需求重新洽谈

3. 选用公钥加密私钥解密的办法至少会比生成同享密钥办法多一次交流对称密钥的通讯进程。

4. 密钥洽谈办法,不仅仅能够完结两个点之间的密钥洽谈,还能够延展到多人之间的一起洽谈出相同的密钥,这样能满意多人集体沟通的需求

端到端加密初步计划

咱们结合关于 DH 算法这种同享密钥办法的认知(公钥可随意揭露),先规划一个简略的端到端音讯加密的进程。

1. 在客户端 APP 初次装置时,根据服务器揭露的两个大局的参数,生成自己的 DH 公钥和私钥。

2. 将自己的公钥上传证书服务器,证书服务器上保存用户标识与其公钥的联系。私钥则保存在客户端上。

3. 初次给对方发送音讯或初次接纳到对方音讯时,便到证书服务器查询对方的公钥。

4. 依据对方公钥和自己的私钥核算出同享密钥。

5. 后续与对方一切的音讯都根据这个密钥和相同的对称加解密算法进行加密解密操作。

融云互联网通信安全系列之端到端加密技术

(端到端音讯加密进程)

至此咱们完结了一个简略的端到端音讯加密计划,在这个计划中咱们引进了一个第三方的用于存储用户公钥的角色,这个角色的存在能够让任何一方都不用关怀对方的在线状态,随时给对方发送加密过音讯,而音讯转发服务器无法解密音讯。

接下来,咱们针对这个简略计划存在的各种问题,进行剖析和优化。

端到端加密计划优化

HMAC

在音讯传输进程中,两边需求确认互相音讯的完整性,简略的做法便是将音讯进行 Hash,得到的 Hash 值附加到音讯后,随音讯一起发送;对端接纳后,相同进行 Hash,来验证音讯是否被篡改。

要害点在于不同数据得到的 Hash 值一定不同,其中带密钥的 Hash 值便是 MAC。

别的,为了避免运用相同的 Hash 函数对相同数据进行操作总是得出相同的值,额定参加一个密钥,这样运用不同密钥就能够得出不同的 MAC。当然,这个密钥是两个对端都知道的。

这样,咱们就得到了根据加密 Hash 的音讯完整性认证的算法——Hash-based MAC。

ECDH

DH 算法是以离散对数的数学难题为基础的,跟着核算机核算才能逐步增强,咱们要不停地运用更大的数以添加破解难度,目前业界普遍认为至少需求运用 2048 位 DH 算法才具备更好的安全性。

在此咱们引进 ECDH 算法替换 DH 算法。ECDH 密钥洽谈算法是 ECC 算法和 DH 密钥交流原理结合运用。ECC 是建立在根据椭圆曲线的离散对数问题上的密码体制。在相同破解难度下,ECC 具有更小长度的密钥和更快的正向核算速度优势。

咱们体系上的 ECDH 能够直接选用目前揭露的 sepc256kl 和 Curve25519 曲线,而无需服务再供给揭露大数参数。

前向安全

在音讯传输进程中,假如洽谈好的密钥泄露了,就意味着一切信息都将暴露于危险之下。为了避免这种状况产生,咱们需求每次加密运用的密钥都与上一次不同,且不能够反向推导得出之前的密钥

此处引进一个 Hash 算法,这个 Hash 算法能够经过输入一个密钥导出别的一个离散性更大的密钥,每次发送音讯时都是用前次的音讯密钥进行 Hash 运算得出本次密钥,由于 Hash 算法具有单向不可逆的特性,因而就无法经过本次的密钥推导之前的密钥。从感观上,这就像一个棘轮,棘轮便是一种特别的齿轮,他只能往一个方向转下去,而不能往回转

双棘轮

出于极致的安全性要求,咱们会考虑前向安全后向安全。怎么确保在某次通讯中,被破解出来的密钥,不能破解出之前的音讯,而且在一定周期内,这个破解出来的密钥将不会再起效果。

介于此咱们再引进别的一个棘轮来确保其向后的安全性。这便是大名鼎鼎的 Signal protocol 中的双棘轮算法。

双棘轮算法包括一个 KDF 棘轮和一个 DH 棘轮。

KDF 全称(Key derivation function) 密钥导出函数,用于从一个原始的密钥导出一个或多个密钥。实质上便是 Hash 函数,一般用来将短密码变生长密码。别的 KDF 需求加“盐”(salt),用于防彩虹表,出于 Hash 的特性,这个“盐”的长度至少要大于 Hash 成果长度。

KDF (原密钥,盐) = 导出密钥

KDF 棘轮便是运用 KDF 算法,规划出一种密钥不断变化的效果,流程如下:

融云互联网通信安全系列之端到端加密技术

(KDF 棘轮流程)

第一步,将初始密钥运用 KDF 算法导出新的密钥,新密钥被切成两部分,前半部分作为下一次 KDF 核算的输入,后半部分作为音讯密钥。

每迭代一次(也能够说棘轮步进一次),就会生成新的音讯密钥。

由于 KDF 算法的单向性,经过这条音讯的密钥无法倒推出上一条音讯密钥。这就确保了密钥的前向安****全。可是假如 KDF 中的盐被掌握,那么它就能够依照这种算法核算出以后一切的音讯密钥。

为了确保后向安全,就要规划一种办法,使每次迭代时引进的盐是随机的,从而确保每次的音讯密钥是不能够向后核算的。

由前面介绍的 DH 算法得知,两对密钥对能够经过 DH 协议生成一个安全的洽谈密钥,假如替换其中一个密钥对,新的洽谈密钥也会变化。

依据这个办法,咱们能够规划出一个安全更新盐的办法。咱们在证书服务器添加一个暂时公钥证书,这个暂时证书是依照接纳两边标识构建的暂时公钥对,即每个人的每个单人会话都具备一个暂时公钥。每进行一个音讯轮回,就更新一次己方的暂时公钥,一起依据别的一方的暂时公钥和己方的私钥进行洽谈,并将洽谈出的密钥作为盐,使得 KDF 棘轮算法生成的音讯密钥具有后向安全性。

在初始时咱们无法预测出每个人一切的新二人会话,那么咱们就能够规定创立新的二人会话时,建议方首要生成一个新的暂时 DH 公私钥对,并向服务器上传自己的暂时 DH 公钥;其次发送方用接纳方公布的长时间公钥与自己的暂时私钥洽谈出密钥作为音讯加密的密钥,对音讯进行加密;最终接纳方初次接纳到音讯后用自己的长时间公钥和发送方的暂时私钥核算得出音讯密钥,并在初次回复音讯时生成暂时公私钥,一起上传暂时公钥。

问题是,假如接纳端不在线,而发送端每条音讯都去更新己方的暂时公钥证书,就会导致宣布去的这些音讯,在接纳端上线并收取后无法被正常解密。

为了处理这个问题,咱们需求规定:只要在宣布音讯并得到对方回复后才更新暂时证书,若对方不回复音讯则不去更新暂时证书。接纳端能回复音讯就表明其现已上线并接纳完音讯,这样就能够确保离线音讯或许音讯乱序也能够被对方正常解析。这种办法便是双棘轮算法中的别的一个 DH 棘轮。

X3DH

对比开始的计划,为了满意音讯的前向安全和后向安全,咱们添加了双棘轮算法,在原基础计划上为每个人添加了一组会话等级暂时 DH 密钥,每个人都具有一个长时间密钥和一组暂时密钥。

可是,由于长时间密钥无法被替换,所以计划仍然存在着安全隐患。因而,Signal protocol 规划了一种更为杂乱和安全的 DH 密钥交流进程,称之为 X3DH,即 DH 协议的 3 倍扩展版。

在 X3DH 协议里,每个人都要创立 3 种密钥对,别离如下:

1. 身份密钥对(Identity Key Pair) —— 一个长时间的契合 DH 协议的密钥对,用户注册时创立,与用户身份绑定;

2. 已签名的预同享密钥(Signed Pre Key) ——一个中期的契合 DH 协议的密钥对,用户注册时创立,由身份密钥签名,并定时进行轮换,此密钥或许是为了维护身份密钥不被泄露;

3. 一次性预同享密钥(One-Time Pre Keys) —— 一次性运用的 Curve25519 密钥对行列,装置时生成,缺乏时弥补。

一切人都要将这 3 种密钥对的公钥上传到服务器上,以便其他人建议会话时运用。

假如 Alice 要给 Bob 发送音讯,首要要和 Bob 确定音讯密钥,流程大致如下:

1. Alice 要创立一个暂时密钥对(ephemeral key),咱们设成 EPK-A,此密钥对是为了后边棘轮算法预备,在此处效果不大;

2. Alice 从服务器获取 Bob 的三种密钥对的公钥:身份密钥对IPK-B;已签名的预同享密钥 SPK-B;一次性预同享密钥 OPK-B;

3. Alice 开始运用 DH 协议核算洽谈密钥,要引进参数包括:自己创立的两个密钥对的私钥,以及 Bob 的三个公钥。然后用相似排列组合的办法,将自己的私钥与对方的公钥别离带入 DH 算法核算。

DH1 = DH(IPK-A, SPK-B)

DH2 = DH(EPK-A, IPK-B)

DH3 = DH(EPK-A, SPK-B)

DH4 = DH(IPK-A, OPK-B)

如图所示:

融云互联网通信安全系列之端到端加密技术

然后将核算得到的四个值,前后衔接起来,就得到了初始密钥,如下:

DH = DH1 || DH2 || DH3 || DH4

注:“||”代表衔接符,比方 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 协议与双棘轮算法,基本上能够满意前向安全和后向安全。当然,真实的处理进程会更为杂乱和安全。

群聊的端到端加密计划

在即时通讯场景中,除了二人之间的谈天以外,还有一个重要的场景便是群聊,那么集体之间的音讯怎么做端到端加密呢?

咱们再次回到 DH 密钥洽谈算法上的推导进程。明显,多方状况下仍然能够持续运用 DH 密钥洽谈算法,这便是群聊中端到端加密的基础。

而在 Signal Protocol 在群组谈天中的规划与二人谈天又有所不同,由于群聊的保密性要求相对低一些,只选用了 KDF 链棘轮+公钥签名来进行加密通讯以保证加密的前向安全。

通讯流程如下:

1. 每个群组成员都要首要生成随机 32 字节的 KDF 链密钥(Chain Key),用于生成音讯密钥,以保证音讯密钥的前向安全性,一起还要生成一个随机 Curve25519 签名密钥对,用于音讯签名。

2. 每个群组成员用向其它成员独自加密发送链密钥(Chain Key)和签名公钥。此刻每一个成员都具有群内一切成员的链密钥和签名公钥。

3. 当一名成员发送音讯时,首要用 KDF 链棘轮算法生成的音讯密钥加密音讯,然后运用私钥签名,再将音讯发给服务器,由服务器发送给其它成员。

4. 其它成员收到加密音讯后,首要运用发送人的签名公钥验证,验证成功后,运用相应的链密钥生成音讯密钥,并用音讯密钥解密。

5. 当群组成员脱离时,一切的群组成员都铲除自己链密钥和签名公钥偏重新生成,再次独自发给每一位成员。这样操作,脱离的成员就无法检查群组内的音讯了。

由上可知,一个人在不同的群组里,会生成不同的链密钥和签名密钥对,以保证群组之间的隔离。在每个群组中,每个成员还要存储其它成员的 KDF 链和签名公钥,假如群组成员过多,加解密运算量非常大,会影响发送和接纳速度,一起密钥办理数据库也会非常大,读取功率也会降低。

所以,群组谈天运用 Signal Protocol 协议,群人数不宜太多

端到端加密计划弥补说明

上面咱们介绍了即时通讯中二人谈天和群组谈天的端到端加密悉数进程。可是正常状况下端到端音讯加密仅仅加密音讯的实践负载部分,而音讯的控制层则不会被加密,由于音讯转发服务器需求依据控制信息进行音讯转发或路由。

为了避免音讯被定向剖析(剖析用户什么时间向谁发送了音讯,或接纳了谁的音讯),咱们仍然需求对全体即时通讯的长衔接链路进行加密维护,避免信息被中间网络设备截获并剖析;为了避免密钥服务器被中间人进犯,也需求开启链路加密维护。