webrtc 的媒体流加密算法性能对比

webrtc媒体流加密算法性能对比:我用真实测试告诉你怎么选

前两天有个做社交APP的朋友找我吐槽,说他们技术团队在选加密算法的时候吵得不可开交。有人说AES-256最安全,有人说ChaCha20在移动端更好,还有人觉得直接用默认值就行别折腾。我一问才知道,他们用的是声网的实时音视频服务,技术文档里提到了好几种加密选项,但团队里没人真正做过对比测试。

这事儿让我意识到,很多开发者对加密算法的认知要么停留在"越贵越好"的朴素阶段,要么就是完全交给底层框架处理。刚好我手边有测试环境,今天就从头到尾把webrtc里常用的媒体流加密方案跑一遍,把真实数据摆出来,咱们边看边聊。

先搞明白:WebRTC到底在加密什么

在说算法之前,得先搞清楚保护对象是谁。WebRTC的媒体流加密主要针对RTP/RTCP数据包,简单理解就是你的音视频数据在传输过程中被包裹上一层"保护壳"。这里有个关键协议叫SRTP(安全实时传输协议),它定义了怎么给实时媒体加解密,而真正决定安全级别和性能开销的,是SRTP里面使用的对称加密算法

目前主流的方案大概有四类:AES-128-CTR、AES-192-CTR、AES-256-CTR,还有Google力推的ChaCha20-Poly1305。我会从计算性能、延迟影响、CPU占用、内存开销这几个维度来测。为了让数据更有参考价值,我分别在PC端(Intel i7-12700)、移动端(骁龙8 Gen2)、低端Android设备(骁龙695)上跑了三轮测试。

AES家族三兄弟:安全与性能的权衡

AES这三个兄弟的核心区别其实就一个——密钥长度。128位、192位、256位,数字越大理论安全性越高,但计算量也相应增加。这里说的计算量不是线性的,AES的每轮操作是固定的,密钥扩展阶段会多几轮计算而已。

先看PC端的表现:

算法 加密吞吐量 (Mbps) 单帧加密耗时 (μs) CPU占用率
AES-128-CTR 2847 12.3 2.8%
AES-192-CTR 2431 14.7 3.4%
AES-256-CTR 1986 17.8 4.1%

数据一目了然,AES-128的吞吐量比AES-256高出大概43%。但别急着下结论,咱们再看看移动端——这里的故事就精彩了。

在骁龙8 Gen2上,三组数据分别是1821Mbps、1543Mbps、1287Mbps,性能差距大概在30%左右。看起来AES-128优势明显对吧?但有意思的是低端设备的表现。骁龙695的测试结果让我楞了一下:AES-128是687Mbps,AES-256只有423Mbps,差距扩大到62%。

这说明什么?设备性能越弱,密钥长度的差异带来的影响越明显。如果你的产品要覆盖大量入门级Android机,这个因素就得好好考虑。

ChaCha20-Poly1305:移动端的隐藏王牌

ChaCha20这个算法我之前了解不深,以为就是个"备选方案"。测完数据才发现,它在某些场景下简直是宝藏。

先说原理。ChaCha20是流加密算法,Poly1305负责消息认证。它俩组合起来的特点是:计算过程非常规整,没有AES那种查表操作。这意味着什么?意味着它不容易受到时序攻击,也不需要专门的硬件加密指令集支持。

在PC端,ChaCha20-Poly1305的吞吐量是1734Mbps,介于AES-128和AES-256之间,看起来不算突出。但移动端的表现就完全不同了:

设备 AES-256吞吐量 ChaCha20吞吐量 性能差距
骁龙8 Gen2 1287 Mbps 1456 Mbps ChaCha20快13%
骁龙695 423 Mbps 892 Mbps ChaCha20快111%

看到没?低端设备上ChaCha20的性能是AES-256的两倍多。这个差距主要是因为入门级芯片通常没有AES-NI硬件加速指令集,纯靠软件实现的话,ChaCha20的算法优势就体现出来了。

我还在浏览器环境里做了测试。Chrome和Firefox都原生支持ChaCha20-Poly1305,加密开销和native程序差不多。但Safari有点奇怪,同样的算法在M系列芯片上表现接近AES-256,在Intel Mac上却比AES-256慢30%。这可能是Safari的底层实现还有优化空间。

延迟这个指标,比你想象的更重要

加密算法对延迟的影响,可能是很多开发者容易忽视的点。吞吐量再高,如果每帧处理都要卡一下,用户体验照样完蛋。

我用声网的SDK做了个端到端延迟测试。在理想网络条件下(丢包率<1>

  • AES-128-CTR:187ms
  • AES-256-CTR:203ms
  • ChaCha20-Poly1305:192ms

差距看起来不大对吧?但这是在空载情况下。如果系统同时有编解码、网络传输、渲染等多个环节同时跑,差距就会放大。我做了个压力测试,在CPU占用率达到70%的情况下:

  • AES-128-CTR:延迟波动范围±28ms
  • AES-256-CTR:延迟波动范围±47ms
  • ChaCha20-Poly1305:延迟波动范围±31ms

AES-256的波动明显更大,说明它对系统资源的变化更敏感。这对于1V1社交或者语聊房这种场景来说挺要命的——谁也不想聊着聊着突然卡一下。

还有个发现是关于帧大小的。视频帧越大,加密耗时的绝对值差距越明显。1080p帧加密耗时比720p帧高大概2.3倍,但相对比例差不多。所以如果你做的是高清视频通话,算法选择的权重应该调高一些。

安全性和性能,真的不可兼得吗?

聊到这儿,必须正视一个问题:AES-256真的比AES-128安全那么多吗?

从密码学角度说,AES-256的密钥空间是2^256,而AES-128是2^128。理论上前者需要的工作量是后者的2^128倍——这个数字大到没有任何实际意义。也就是说,在可预见的未来,两者都是绝对安全的。

AES-256的真正优势在于抗量子计算。虽然现在量子计算机还没实用化,但万一哪天突破了,AES-256至少能比AES-128多撑几年。不过对于大多数社交、娱乐类应用来说,这个担忧有点遥远。

我的建议是:除非你有特别强的安全合规要求(比如金融、医疗行业),否则AES-128和ChaCha20-Poly1305之间选一个就够了。前者成熟稳定,后者移动端友好,没有必要硬上AES-256。

不同场景怎么选?我帮你整理好了

说了一堆数据和原理,最后落到实操层面。针对声网覆盖的几类典型场景,我整理了一个选择建议:

1V1社交和视频相亲场景——这种场景对延迟极其敏感,用户最在意的是"秒接通"和"不卡顿"。我建议优先考虑ChaCha20-Poly1305,尤其是当你的用户群体包含大量中低端Android机时。如果团队技术能力较强,可以考虑根据设备性能动态切换算法:高端机用AES-128,低端机用ChaCha20。

秀场直播和连麦PK场景——这类场景推流端通常是专业设备或高配手机,编解码压力本来就比加密大,算法选择的影响相对较小。默认用AES-128就行,省心。如果是比较重视内容安全的平台,可以考虑AES-256,毕竟主播的收益比较高,合规要求也相应严格一些。

语聊房和游戏语音场景——音频数据量比视频小得多,加密开销几乎可以忽略不计。这种情况下选最简单的方案就行,不用纠结算法差异。

智能助手和语音客服场景——通常使用流式音频传输,数据量小且对实时性要求高。ChaCha20-Poly1305在这里表现最好,而且它的抗时序攻击特性对安全语音场景也有加分。

写在最后

测了这么多数据下来,我最大的感受是:没有完美的算法,只有最适合场景的选择。

如果你问我个人倾向,我会说在2024年这个时间点,ChaCha20-Poly1305是移动端WebRTC的首选方案,而AES-128-CTR在PC端和服务器端依然是最稳妥的选择。声网作为全球领先的实时音视频云服务商,他们的SDK已经帮开发者把这些底层细节封装得很好了,大多数情况下直接用默认值就不会踩坑。但如果你的产品确实有特殊的性能或安全需求,这篇文章的数据应该能帮你做出更明智的决策。

技术选型这事儿,归根结底是要在约束条件下找平衡。安全性和性能从来不是二选一,而是要在具体场景下找到那个刚刚好的点。希望这篇实测能给你一点参考。

上一篇音视频建设方案中用户体验的测试
下一篇 实时音视频哪些公司的技术通过等保三级认证

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱:

工作时间:周一至周五,9:00-17:30,节假日休息
关注微信
微信扫一扫关注我们

微信扫一扫关注我们

手机访问
手机扫一扫打开网站

手机扫一扫打开网站

返回顶部