当前位置: 首页 > news >正文

WebRTC 安全性分析研究

一、概述

本文着重分析 WebRTC 的安全性,分析其安全性考虑及安全性实现,回答了以下问题:

  • WebRTC 加密过程需要或依赖 CA (Certificate Authority)吗? 不需要 CA, 但可能依赖 CA.
  • DTLS-SRTP 加密机制中, DTLS 与 SRTP 的关系是什么? DTLS 实现秘钥交换和管理, SRTP 实现具体的加密和解密过程.
  • DTLS 握手交换秘钥的安全性如何进行保障? 明文传输,但通过其它机制保证握手阶段数据的一致性.

二、顶层结构

为了解释和回答上述问题,需要对 WebRTC 的整体结构进行初步的描述.

根据 [RFC9429] , 无论是 WebRTC 的何种变体,都遵循着 媒体信令媒体传输 的两级分层:
在这里插入图片描述
媒体信令: 通过 HTTPS 、加密SIP 或 加密WebSocket 等方式实现 SDP的交换(协商), 具体协议类型由应用决定,信令传输安全也交由应用负责.

媒体传输: 规定数据传输使用 DTLS-SRTP , 数据传输安全由 DTLS-SRTP 负责.

但是 媒体传输 一定是安全的吗?

在没有 CA 的背书下, DTLS-SRTP 是无法解决 MITM (中间人攻击);

故媒体信令传输过程中, SDP 引入了一种新的机制,用于解决此问题. (在后文会具体展开描述)

除了中间人攻击之外, DTLS-SRTP 传输是安全的.

三、媒体传输

DTLS-SRTP 的关系是什么, 在 [RFC5736](Framework for Establishing a Secure Real-time Transport Protocol (SRTP) Security Context Using Datagram Transport Layer Security (DTLS)) 解释了它们之间的关系.

  • DTLS : 支持 秘钥交换(DTLS Handshake Protocol) 和 数据加密 (DTLS Record Protocol)
  • SRTP : 支持数据加密

故 SRTP 在实践过程中需要一种其他协议帮助其实现秘钥管理,这个协议就是 DTLS.

DTLS-SRTP 的完成描述是: 秘钥交换过程使用 DTLS 的握手实现, SRTP 则实现数据加密和解密.

(1) 秘钥交换

其中 DTLS 的握手协议是基于 TLS 制定的,可以在 [RFC5246](The Transport Layer Security (TLS) Protocol Version 1.2) 中找到:
在这里插入图片描述
其中 * 为可选, 以双向认证(包含上述所有步骤)为例进行解释说明:

角色信令描述
客户端ClientHello提供可选加密算法
服务端ServerHello选择具体的加密算法
服务端Certificate服务端发送证书
服务端ServerKeyExchange发送秘钥交换参数
服务端CertificateRequest要求客户端提供证书
服务端ServerHelloDone
客户端Certificate客户端发送证书
客户端ClientKeyExchange发送密钥交换材料
客户端CertificateVerify验证客户端身份
客户端ChangeCipherSpec通知对方要开始加密
服务端Finished握手完成信号包

完整流程如上, 其中 Certificate 是需要其它机制保证其安全:

即单纯的 DTLS 握手解决不了 我是我 这个核心问题, 在存在中间人窃听过程中, 中间人可伪造证书横跨在客户端及服务端之间.

常见的做法是对双端发送的证书做 CA 认证, 来回答 我是我 的这个问题;

但 WebRTC 对此的安全处理与此稍微不同,虽然本质是一样的, 在后文展开描述.

(2) 数据加密

由于 SRTP 已经相对来说比较成熟,一般实际开发过程中由 libsrtp 实现, 故此部分可简略描述.

通俗简单地描述, DLTS 未将接收到的数据原封不动地传输给 SRTP, SRTP 需要发送的数据也会原封不动地传输给 DTLS.

(3) 相关参考

  • RFC6347 : Datagram Transport Layer Security Version 1.2
  • RFC5736 : Datagram Transport Layer Security (DTLS) Extension to Establish Keys for the Secure Real-time Transport Protocol (SRTP)
  • RFC3711 : The Secure Real-time Transport Protocol (SRTP)
  • RFC5264 : The Transport Layer Security (TLS) Protocol Version 1.2

四、信令交互

媒体传输 中遗留了一个问题,如何证明 我是我.

在传统做法中,可以通过 CA 来证明 我是我 的这个问题, CA 认证可以确保证书的完整性不被破坏, 即数据未被篡改.

更进一步, DTLS 握手过程中的安全性,不依赖于数据加密,仅依赖于数据一致性.

为了实现数据一致性,WebRTC 的做法是对证书做一个 HMAC 指纹运算 (本质上就是证书的哈希值),然后这个证书指纹通过其它安全的方式进行传输.

这样,在 DTLS 握手阶段的 Certificate 环节,服务端和客户端就可以对收到的证书进行同样的哈希运算得到对比指纹,如果指纹与原先通过其它途径获取到的证书指纹一致的,则回答了 我是我 这个问题.

这个的其他途径是什么?

[RFC8122](Connection-Oriented Media Transport over the Transport Layer Security (TLS) Protocol in the Session Description Protocol (SDP)) 描述了这个过程,

通过在 SDP 里携带一个新的 attribute fingerprint,携带这个证书指纹.

故这里隐含了两条信息:

  • 数据传输的安全性隐式地依赖与信令传输的安全性,若 SDP 传输是通过安全协议 (如 HTTPS 、加密 SIP 等),则可认为数据传输是安全的
  • 数据传输使用的证书可能不是 CA 认证过的证书, 可以是自签证书,但是自签证书可能隐式地收到CA证书的安全保护 (如 WHIP RTC 推流, SDP 是通过 HTTPS 进行的)

WebRTC 的安全性考虑性,本质上是安全链传递.

相关参考:

  • RFC 8122 : Connection-Oriented Media Transport over the Transport Layer Security (TLS) Protocol in the Session Description Protocol (SDP)

为什么 WebRTC 的媒体传输设计考虑不依赖于 CA 认证?
因为在实践操作过程中几乎不可能实行, [RFC8122](3.3 The Need for Self-Signed Certificates) 中进行的详细描述, 主要难点在于:

  • RTC 设计是应用在任意终端的, 而 CA 证书一般是公网服务器才具备的条件
  • CA 认证要求 IP 是固定的, 而很多情况下地址是动态的 (如使用 DHCP)

故实际媒体传输使用的证书往往使用自签证书.

http://www.lryc.cn/news/579327.html

相关文章:

  • C# 线程同步(一)同步概念介绍
  • 网络安全的未来趋势与挑战
  • 好用的自带AI功能的国产IDE
  • Java-63 深入浅出 分布式服务 网络通信 RPC 与 RMI 详解
  • Spring 为何需要三级缓存解决循环依赖,而不是二级缓存
  • 【网络安全】Webshell命令执行失败解决思路
  • 【第十一篇】SpringBoot缓存技术
  • Javaweb - 10.1 Servlet
  • C盘空间的“元凶”——虚拟内存的神秘面纱
  • css ::before学习笔记
  • 专业AI工具导航与人工智能学习平台AIbase.cn 连接现在与AI未来的智能桥梁
  • YOLO基础算法入门之YOLOv8中的C2f(C2-Faster)高效特征提取结构
  • STC8G 8051内核单片机开发 (中断)
  • 算法学习笔记:4.KMP 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
  • 家政维修小程序源码php方案解析
  • FASTAPI+VUE3平价商贸管理系统
  • 实际开发如何快速定位和解决死锁?
  • thinkphp中间件
  • 协同过滤推荐算法
  • 动态规划-P1216 [IOI 1994] 数字三角形 Number Triangles
  • RAG实战指南 Day 4:LlamaIndex框架实战指南
  • AutoMedPrompt的技术,自动优化提示词
  • 基于 govaluate 的监控系统中,如何设计灵活可扩展的自定义表达式函数体系
  • 【学习线路】机器学习线路概述与内容关键点说明
  • 解决 Spring Boot 对 Elasticsearch 字段没有小驼峰映射的问题
  • STC8G 8051内核单片机开发(GPIO)
  • “Payload document size is larger than maximum of 16793600.“问题解决(MongoDB)
  • C++ 网络编程(14) asio多线程模型IOThreadPool
  • PyTorch 安装使用教程
  • EXCEL小妙招——判断A列和B列是否相等