【网络通信 -- 直播】网络通信协议简介 -- SRTP/SRTCP

article/2025/10/13 11:29:06

【网络通信 -- 直播】网络通信协议简介 -- SRTP/SRTCP

【0】简介

安全实时传输协议 (Secure Real-time Transport Protocol,SRTP) 是在实时传输协议 (Real-time Transport Protocol,RTP) 基础上定义的一个协议,旨在为单播和多播应用程序中的实时传输协议的数据提供加密、消息认证、完整性保证和重放保护,由 David Oran (思科) 和 Rolf Blom (爱立信) 开发,并最早由 IETF 于 2004 年 3 月作为 RFC3711 发布;
安全实时传输协议有一个伴生协议,即安全实时传输控制协议 (Secure RTCP,SRTCP),安全实时传输控制协议为实时传输控制协议 (RTCP) 提供类似的与安全有关的特性;

【1】协议格式

【1.1】SRTP 协议格式

SRTP 部首各字段说明

字段长度说明补充
V2 bit版本号取值 2
P1 bit填充位当负载的长度不够 32bit 的整数倍时则需要填充
X1 bit扩展位若为 1 则固定的包头后增加一个 32 bits 的扩展
CC4 bitCSRC 的数目CSRC,提供源标识符
M1 bit标志位含义取决于携带净荷的类型,对于视频,
标记一帧的结束;对于音频,标记会话的开始
PT7 bit载荷的格式 
序列号16 bit会话开始时,发送端生成随机数作为初始值,
传送 RTP 分组时,每传送一组该字段增 1
在会话存在期间,顺序发送的一串 RTP 分组的序号是递增的,
接收端可以根据序号检测是否存在分组丢失或错序
时间戳32 bit净荷中第一个采样数据的采样时间,每一个采样数据的采样时间通过一个单调且线性递增的时钟获得时钟频率取决于净荷数据的编码格式,相邻两个 RTP 分组的时间戳差值,取决于前一个 RTP 分组净荷中包含的采样数据数目
SSRC32 bit同步源标识符标明同步源,同步源是一个负责发送 RTP 分组并
在 RTP 分组中设置序号和时间戳的实体
CSRC32 bit负载中的有效贡献源 
RTP extension
(可选)
32 bitRTP 扩展项(可选) 
payload 加密的载荷末尾可能包含 RTP padding 和 RTP pad count
SRTP MKI
(可选)
 master key 生成器用来生成 session 加密密钥的随机位串标识符
Authentication tag 认证标签 
  • 1. 加密部分 Encrypted Portion,由 payload,RTP padding 和 RTP pad count 部分组成,即仅对 RTP 负载数据加密;
  • 2. 需要校验部分 Authenticated Portion,由 RTP Header,RTP Header extension 和 Encrypted Portion 部分组成;

【1.2】SRTCP 协议格式

各个字段的含义参考 【网络通信 -- 直播】网络通信协议简介 -- RTP/RTCP

  • 1. 加密部分 Encrypted Portion 为 RTCP Header 之后的部分
  • 2. E-flag 显式给出了 RTCP 包是否加密
  • 3. SRTCP index 显示给出了 RTCP 包的序列号,用来防重放攻击
  • 4. 待校验部分 Authenticated Portion 由 RTCP Header 和 Encrypted Portion 部分组成

【2】加密环境简介

  • 通信参与者的 SRTP/SRTCP 会话 (SRTP/SRTCP Session),在 SRTP/SRTCP 协议中,使用二元组 <SRTP 目的 IP 地址,SRTP/SRTCP 目的端口> 的方式来标识;
  • 流 (stream),一个 SRTP/SRTCP Session 由多个 stream 组成,在 SRTP 协议中使用三元组 <SSRC,RTP/RTCP 目的地址,RTP/RTCP 目的端口> 来标识一个 stream;
  • 加密环境 (Cryptographic Context),每个 stream 的加解密相关参数的描述,加密环境 ID 由 SSRC,目的网络地址和目的传输端口号唯一确定,即 Cryptographic_Context_ID = <SSRC, dest address, drstv port>;
    • 加密环境保存两类参数,分别为变换相关参数和变换无关参数;
      • 变换相关参数指与所使用具体加密变换方法和认证变换方法有关的参数,如密码组大小,会话密钥,初始化向量信息数据等;
    • 变换无关参数包括
      • 1. 一个 32 位的循环计数器 (ROC),用来记录 16 bit 的 RTP 序列号有多少次超过 65535 后被置位 0,根据 ROC 来产生 SRTP 数据包索引 index,其中 index = 2^16 * ROC + SEQ,SEQ 为 RTP 数据包序列号,从数据包中获取;
      • 2. 一个 16 bit 序列号保存接收方接收到的最高 RTP 序列号;
      • 3. 加密算法的标识符,标识使用的加密算法;
      • 4. 消息认证算法的标识符,标识使用的认证算法;
      • 5. 重放列表,若启用了消息认证则接收方需保存一张重放列表,记录最近收到并通过认证的 SRTP 数据包索引号,该列表长度不得低于 256;
      • 6. MKI 指示器 (0/1),标识是否包中有 MKI;
      • 7. MKI 值,如果 MKI 指示器为 1,则保存 MKI 字段长度,发送方当前使用的 KMI 值;
      • 8. 主密钥,需要随机和保密,每个主密钥有以下相关参数
        • 1) 主 salt,用来从主密钥推导会话秘钥,是个随机数,可以公开
        • 2) 密钥推导率,用来从主密钥推导会话密钥,是 2 的幂次方
        • 3) 对应的 MKI 值
        • 4) <From,To> 定义主密钥的存活时间,From, To 是两个 48bit 的 SRTP 包索引号
        • 5) 一个计数器,记录用该主密钥处理的 SRTP 包数量
      • 9. 两个非负整数 n_e 和 n_a 来表示加密会话密钥和认证会话密钥的长度

【3】SRTP 密钥

会话密钥 (Session Key),在同一个 SRTP/SRTCP Session 中,每个 Stream 使用到的属于自己的,加解密 Key,Authentication Key 的集合;

  • Session Key 通过对 Master Key 使用 KDF (Key Derivation Function) 导出;

KDF,用于导出 Session Key 函数;

  • 例如,在完成 DTLS 后,协商得到的 SRTP 加密算法的 Profile 如下
SRTP_AES128_CM_HMAC_SHA1_80cipher: AES_128_CMcipher_key_length: 128cipher_salt_length: 112maximum_lifetime: 2^31auth_function: HMAC-SHA1auth_key_length: 160auth_tag_length: 80

则对应的 KDF 为 AES128_CM;

Session Key 产生过程

Session Key 导出依赖的参数

  • key_label,根据导出的 Key 的类型不同,key_label 取值如下

  • master_key,DTLS 完成后,协商得到的 Key;
  • master_salt,DTLS 完成后,协商得到的 Salt;
  • packet_index,RTP/RTCP 的包序号;
    • SRTP 使用 48-bits 的隐式包序号,SRTCP 使用 31-bits 包序号;
  • key_derivation_rate,key 导出速率,记为 kdr,默认取值为 0,执行 1 次 Key 导出;
    • 取值范围 {{1,2,4,...,2^24}
    • 在 key_derivation_rate > 0 的情况下,在加密之前,执行一次 key 导出,后续在 packet_index/key_derivation_rate > 0 时,执行 key 导出;
r = packet_index / kdr
key_id = label || r
x = key_id XOR master_salt
key = KDF(master_key, x)说明
'/' : 表示整除,B = 0 时,C = A/B = 0;
|| : 表示连接的含义,A,B,C 使用网络字节序表示,C = A||B,则 C 的高字节为 A,低字节位为 B;
XOR : 表示异或运算,计算时按照低字节位对齐;

【4】序号管理

SRTP 序列号管理,在 RTP 包结构定义中使用 16 bit 来描述序列号;考虑到防重放攻击,消息完整性校验,加密数据,导出 SessionKey 的需要,在 SRTP 协议中,使用隐式方式 (标识 i) 来记录包序列号 packet_index;

对于发送端,i 的计算方式i = 2^16 * ROC + SEQ其中,
SEQ 是 RTP 包中描述的 16 bit 包序号;
ROC (rollover  couter) 是 RTP 包序号 (SEQ) 翻转计数,即每当 SEQ/2^16 = 0,ROC 计数加 1,ROC 初始值为 0;对于接收端,考虑到丢包和乱序因素的影响,需要维护 ROC,以及当前收到的最大包序号 s_l;当一个新的包到来时候,接收端需要估计出当前包所对应的实际 SRTP 包的序号;ROC 的初始值为 0,s_l 的初始值为收到第一个 SRTP 包的 SEQ;后续通过如下公式估计接收到的 SRTP 序号 i;i = 2^16 * v + SEQ其中,
v 可能的取值 { ROC - 1, ROC, ROC + 1 },ROC 是接收端本地维护的 ROC,SEQ 是收到 SRTP 的序号;v 分别取 ROC - 1,ROC,ROC + 1 计算出 i 与 2^16 * ROC + s_l 进行比较,选择更接近的值;完成 SRTP 解密和完整性校验后,分如下 3 种情况,更新 ROC 和 s_l1. v = ROC - 1,ROC 和 s_l 不更新2. v = ROC,如果 SEQ > s_1,则更新 s_l = SEQ3. v = ROC + 1,ROC = v = ROC + 1,s_l = SEQ

SRTCP 序列号管理,SRTCP 的序号在 SRTCP 包,使用 31-bits 中显示描述

【5】防重放攻击

重放攻击,攻击者将截获的 SRTP/SRTCP 包保存下来,然后重新发送到网络中,实现了包的重放;
SRTP 接收者通过维护一个重放列表 (ReplayList) 来防止这种攻击;

  • 理论上 Replay List 应该保存所有接收到并完成校验的包的序列号 index;
  • 实际情况下 ReplayList 使用滑动窗口 (sliding window) 来实现防重放攻击,使用 SRTP-WINDOW-SIZE 来描述滑动窗口的大小;

SRTP 防重放攻击

接收者根据接收到的 SRTP 包的 SEQ,ROC,s_l 估算出 SRTP 包的 packet_index,将接收者已经接收到 SRTP 包的最大序列号,记为 local_packet_index,计算差值 delta;

delta =  packet_index - local_packet_index

分如下 3 种情况说明:

  • 1. delta > 0 : 表示收到了新的包
  • 2. delta < -(SRTP-WINDOW-SIZE - 1) < 0 : 表示收到的包的序列号,小于重放窗口要求的最小序号,libSRTP 收到这样的包时,会返回 srtp_err_status_replay_old = 10,表示收到旧的重放包;
  • 3. delta < 0,delta >= -(SRTP-WINDOW-SIZE - 1) : 表示收到了重放窗口之内的包;如果在 ReplayList 找到对应的包,则是一个 index 重复的重放包,libSRTP 收到这样的包时,会返回 srtp_err_status_replay_fail = 9;否则表示收到一个乱序包;

SRTCP 防重放攻击

在 SRTCP 中,packet index 显式给出,在 libsrtp 中,SRTCP 的防重放攻击的窗口大小为 128,使用 window_start 记录防重放攻击的起始序列号;

  • SRTCP 防重放攻击的检查步骤
    • 1. index > window_start + 128,收到新的 SRTCP 包
    • 2. index < window_start,收到包的序列号在重放窗口的左侧,可以认为收到了比较老的包,libsrtp 收到这样的包之后,会返回 srtp_err_status_replay_old = 10;
    • 3. replay_list_index = index - window_start,在 ReplayList 中 replay_list_index 对应的标识位为 1,表示已经收到包,libsrtp 返回 srtp_err_status_replay_fail = 9;对应的标识位为 0,表示收到乱序包;

【6】加密和校验算法

在 SRTP 中,使用 CTR (Counter mode) 模式的 AES 加密算法,CTR 模式通过递增一个加密计数器以产生连续的密钥流,计数器可以是任意保证长时间不产生重复输出的密钥,根据计数方式的不同,分为以下两种类型;

  • AES-ICM : ICM 模式 (Integer Counter Mode,整数计数模式),使用整数计数运算;
  • AES-GCM : GCM 模式 (Galois Counter Mode,基于伽罗瓦域计数模式),计数运算定义在伽罗瓦域;

在 SRTP/SRTCP 中,使用 AES-ICM 完成加密算法,同时使用 HMAC-SHA1 完成 MAC 计算,对数据进行完整性校验,加密和 MAC 计算需要分两步完成;

  • SRTP 和 SRTCP 计算 Authentication tag,使用的 K 对应 Key 管理部分描述的 RTP auth key 和 RTCP auth key,使用的 Hash 算法为 SHA-1,Authentication tag 的长度为 80-bits;
  • SRTP 中的 M 为,M = Authenticated Portion + ROC
  • SRTCP 中的 M 为,M = Authenticated Portion

AES-ICM (加密)

图示为 AES-ICM 的加密和解密过程,图中的 K 是通过 KDF 导出的 SessionKey;

 

  • 加密,通过对 Counter 进行加密并与明文 P 异或运算得到加密数据 C;
  • 解密,通过对 Counter 进行加密并与密文 C 异或运算得到明文数据 P;
  • Counter 生成依赖于 Session Salt,包的索引 (packet index) 和包的 SSRC,Counter 是 128 bits 的计数,生成方式如下
one byte
<-->
0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|00|00|00|00|   SSRC    |   packet index  | b_c |---+
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+   ||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+   v
|                  salt (k_s)             |00|00|->(+)
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+   ||v+-------------+encryption key (k_e) -> | AES encrypt |+-------------+|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+   |
|                keystream block                |<--+
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

HMAC-SHA1 (完整性校验)

散列消息认证码 (Hash-based message authentication code,缩写为 HMAC),是一种通过特别计算方式之后产生的消息认证码 (MAC),使用密码散列函数,同时结合一个加密密钥,可以用来保证数据的完整性,同时可以用作某个消息的身份验证;
HMAC 通过一个标准算法,在计算哈希的过程中,把 key 混入计算过程中,HMAC 的加密实现如下;

HMAC(K,M) = H ( (K XOR opad ) + H( (K XOR ipad ) + M ) )H:hash 算法,比如,MD5,SHA-1,SHA-256B:块字节的长度,块是 hash 操作的基本单位,这里 B = 64L:hash 算法计算出来的字节长度 (L = 16 for MD5,L = 20 for SHA-1)
K:共享密钥,K 的长度可以是任意的,但是为了安全考虑,还是推荐 K 的长度 > B;
如果 K 的长度 > B 则会先在 K 上面执行 hash 算法,将得到的 L 长度结果作为新的共享密钥;
如果 K 的长度 < B 则会在 K 后面填充 0x00 一直到等于长度 B;
M:要认证的内容
opad:外部填充常量,是 0x5C 重复 B 次
ipad:内部填充常量,是 0x36 重复 B 次
XOR:异或运算
+:代表 "连接" 运算

文献资料

【1】The Secure Real-Time Transport Protocol(SRTP)

参考致谢
本博客为博主的学习实践总结,并参考了众多博主的博文,在此表示感谢,博主若有不足之处,请批评指正。

【1】WebRTC 传输安全机制第二话:深入显出 SRTP 协议

【2】RTP/RTCP 和 SRTP/SRTCP协议

【3】WebRTC 学习一常见网络协议

【4】流媒体协议介绍(RTP/RTCP/RTSP/RTMP/MMS/HLS)


http://chatgpt.dhexx.cn/article/Hioe0Waf.shtml

相关文章

RFC4568规范:SDP协商SRTP密钥

SDP协商SRTP密钥 RFC4568中关于媒体流加密说明时&#xff0c;在SDP中新增了"crypto"字段用于描述加密信息&#xff0c;格式如下&#xff1a; acrypto:<tag> <crypto-suite> <key-params> [<session-params>] 其中&#xff1a; <…

srtp的致命错误

文章目录 javaweb使用了ajax技术依然刷新页面法一法二法三 javaweb后台servlet不能重定向问题javaweb失败加载xxx&#xff0c;因为没有框架当用户一台设备打开多个网页访问我的窗口时验证码错误的实质session的实质浏览器和服务器之间的session关联的技术内幕实验验证 javaweb使…

Janus dtlssrtp 流程图

1 init 2 create bio接口和pre 秘钥 各个部分说明: 绑定ssl和bio;SSL_set_bio(dtls->ssl, dtls->read_bio, dtls->filter_bio);//init dtls:SSL_new--使用BIO那么就可以和SSL、非加密的网络以及文件IO进行透明的连接;BIO可以连接在一起成为一个BIO链//读写bio就等于读…

TLS-SRTP协议详解

当webrtc通过tls握手完成,会把key和加密算法给srtp,由srtp进行数据的加密和解密。 srtp使用的是对称的加解密算法。而dtls握手协议使用的是非对称的加解密算法。 对称加密算法需要同一个密钥。此时通过tls握手,a给b自己的密钥,b给a自己的密钥,a用自己的密钥加密,b用a给的…

SRTP RFC 3711

目录 1 SRTP session key 2 RTP 加密 2.1 RTP body加密 2.1.1 计算IV 2.1.2 计算AAD 1 SRTP session key K

WebRTC 传输安全机制:深入显出 SRTP 协议

简介&#xff1a;SRTP&#xff1a;安全传输协议&#xff08;Secure Real-time Transport&#xff09; 通过 DTLS 协商后&#xff0c;RTC 通信的双方完成 MasterKey 和 MasterSalt 的协商。接下来&#xff0c;我们继续分析在 WebRTC 中&#xff0c;如何使用交换的密钥&#xff0…

视频码流传输协议srtp/srtcp详细介绍

RTP/RTCP 协议并没有对它的负载数据进行任何保护。因此&#xff0c;如果攻击者通过抓包工具&#xff0c;如 Wireshark&#xff0c;将音视频数据抓取到后&#xff0c;通过该工具就可以直接将音视频流播放出来&#xff0c;这是非常恐怖的事情&#xff0c;这里可以通过srtp/srtcp协…

计算机专业srtp项目选题,我都大二了,才知道什么是SRTP

原标题:我都大二了,才知道什么是SRTP 大二下学期一开始,陆陆续续有同学问我: “哎,你报名SRTP了吗?” “你SRTP找了哪个老师了?” “我们SRTP组队吧!” 这时的我,一脸懵逼: 啥??? 惊讶的目光顿时向我扫来, “你连SRTP都不知道? 我一入学学长学姐就告诉我了!” …

WebRTC 传输安全机制:DTLS 和 SRTP

在 WebRTC 中&#xff0c;为了保证媒体传输的安全性&#xff0c;引入了 DTLS 和 SRTP 来对通信过程进行加密。DTLS 的作用、原理与 SSL/TLS 类似&#xff0c;都是为了使通信过程变得更安全。 常用加密方法 加密技术 1. 对称加密 对称加密&#xff08;Symmetric Cryptograph…

DTLS-SRTP协议学习

1.DTLS-SRTP&#xff1a; WEBRTC中真正使用的协议&#xff0c;会使用DTLS握手协议后交换证书key&#xff0c;交换完成将key和加密算法交给SRTP进行数据加解密。 2.DTLS要解决的问题&#xff1a; 2.1.交互密钥 SRTP是真正加解密的&#xff0c;使用的是对称的加密算法。DTLS使…

SRTP是如何工作的

什么是SRTP 参考RFC 3711 - The Secure Real-time Transport Protocol 参考RFC 7201 - Options for Securing RTP Sessions RTP是实时传输协议&#xff0c;用于媒体通信&#xff1b;SRTP就是加密的实时传输协议。 工作原理很简单&#xff0c;即在RTP开始前&#xff0c;双方先协…

SRTP/SRTCP协议

SRTP(Secure Real Time Protocol)安全实时传输协议&#xff0c;SRTCP(Secure Real Time Controle Protocol)安全实时传输控制协议。了解这个两个协议之前&#xff0c;首先需要了解RTP和RTCP协议&#xff0c;SRTP和SRTCP是在RTP和RTCP传输的基础上&#xff0c;对数据进行了加密和…

VoIP之SRTP

互联网已经渗透到生活的方方面面,用户对于网络信息安全的要求非常高。在VoIP领域中&#xff0c;使用SRTP对音频、视频数据进行加密&#xff0c;保证数据安全。 SRTP的作用如下&#xff1a; 1. 保证RTP包中负载&#xff08;音视频数据&#xff09;的机密性 2. RTP包完整性确认&…

音视频协议-SRTP

1 SRTP环境搭建 1.1 SRTP简介 STRP它是 思科的开源安全 RTP 库。RTP 是实时传输协议&#xff0c;一种用于传输实时数据&#xff08;如电话、音频和视频&#xff09;的 IETF 标准&#xff0c;由RFC 3550定义。SRTP用于为 RTP 数据提供机密性以及对 RTP 标头和有效负载进行身份…

关系型数据库设计

目录 一、本章目标 二、为什么需要设计数据库 三、设计数据库的步骤 四、数据库设计E-R图 4.1为什么使用E-R图 4.2绘制E-R图 4.3实体间的映射关系 五、数据库设计模型转换 5.1关系型数据库设计分类 5.2各模型之间的元素对应关系 5.3基本转换原理 5.4将实体关系转化为表…

个人博客数据库设计

前言 最近要做数据库大作业&#xff0c;在思考了很久之后&#xff0c;还是设计一个简单的个人博客数据库&#xff0c;数据库采用的时MySQL5.7。 数据库下载&#xff08;提取码: s2f9&#xff09; 一、 概述及分析 1.1 项目背景 随着互联网的发展&#xff0c;越来越多的人拥…

[数据库设计]如何合理和有效的进行数据库设计

#前言 通常情况下&#xff0c;可以从两个方面来判断数据库设计的是否规范: 1)一是看看是否拥有大量的窄表 窄表往往对于OLTP比较合适&#xff0c;符合范式设计原则 2)宽表的数量是否足够的少。 所谓的宽表就是字段比较多的表&#xff0c;包含的维度层次比较多&#xff0c;造成冗…

数据库设计实战(一):数据库设计规范

一、数据库设计流程 1、需求分析 确定用户对数据库系统的使用要求和各种约束条件&#xff0c;形成用户需求规约 2、概念设计 对用户要求描述的现实世界&#xff0c;通过对其分类、聚集和概括&#xff0c;建立抽象的概念数据模型 3、逻辑设计 将现实世界的概念数据模型设计…

详解数据库设计的四个阶段

一、系统需求分析阶段 数据库设计的第一步&#xff0c;就是了解与分析用户需求&#xff0c;确定系统边界信息需求、处理需求、安全性和完整性需求&#xff0c;然后编写系统分析报告。 系统分析报告的内容主要包括&#xff1a; 随系统分析报告需提供的附件还有&#xff1a; …

MySQL数据库设计-案例

大家好&#xff0c;我是忘鱼。分享一下数据库设计&#xff08;案例&#xff09; 目录 一、案例 二、代码 三、总结 一、案例 如下进行数据库设计。这是黑马上的一道练习题。 二、代码 drop table if EXISTS music; drop table if EXISTS song; drop table if EXI…