【网络通信 -- 直播】网络通信协议简介 -- SRTP/SRTCP
【网络通信 -- 直播】网络通信协议简介 -- 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 部首各字段说明
字段 | 长度 | 说明 | 补充 |
V | 2 bit | 版本号 | 取值 2 |
P | 1 bit | 填充位 | 当负载的长度不够 32bit 的整数倍时则需要填充 |
X | 1 bit | 扩展位 | 若为 1 则固定的包头后增加一个 32 bits 的扩展 |
CC | 4 bit | CSRC 的数目 | CSRC,提供源标识符 |
M | 1 bit | 标志位 |
含义取决于携带净荷的类型,对于视频, 标记一帧的结束;对于音频,标记会话的开始 |
PT | 7 bit | 载荷的格式 | |
序列号 | 16 bit |
会话开始时,发送端生成随机数作为初始值, 传送 RTP 分组时,每传送一组该字段增 1 |
在会话存在期间,顺序发送的一串 RTP 分组的序号是递增的, 接收端可以根据序号检测是否存在分组丢失或错序 |
时间戳 | 32 bit | 净荷中第一个采样数据的采样时间,每一个采样数据的采样时间通过一个单调且线性递增的时钟获得 | 时钟频率取决于净荷数据的编码格式,相邻两个 RTP 分组的时间戳差值,取决于前一个 RTP 分组净荷中包含的采样数据数目 |
SSRC | 32 bit | 同步源标识符 |
标明同步源,同步源是一个负责发送 RTP 分组并 在 RTP 分组中设置序号和时间戳的实体 |
CSRC | 32 bit | 负载中的有效贡献源 | |
RTP extension (可选) |
32 bit | RTP 扩展项(可选) | |
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)
【网络通信 -- 直播】网络通信协议简介 -- SRTP/SRTCP相关推荐
- 【网络通信 -- 直播】网络通信协议简介 -- SSL/TLS 与 DTLS
[网络通信 -- 直播]网络通信协议简介 -- SSL/TLS 与 DTLS [1]网络传输中加密的一般概念 对称密钥加密技术,加密过程和解密过程使用的是同一个密钥: 常见的对称加密算法有 DES.3 ...
- 【网络通信 -- 直播】FFMPEG 简介与常用命令总结
[网络通信 -- 直播]FFMPEG 简介与常用命令总结 [1]FFMPEG 简介 FFmpeg,项目的名称来自 MPEG 视频编码标准,"FF"代表"Fast Forw ...
- Web技术的发展 网络发展简介(三)
在上一篇文章中,对TCP/IP通信协议进行了简单的介绍 通信协议是通信的理论基石,计算机.操作系统以及各种网络设备对通信的支持是计算机网络通信的物质基础 而web服务则是运行于应用层,借助于应用层的协 ...
- RTP/RTMP/RTSP/RTCP/SRTP/SRTCP等基础协议了解
文章目录 一.前言 二.RTP 三.RTCP 四.SRTP & SRTCP 五.RTSP 六.RTSP 和RTP的关系 一.前言 实现流媒体实现推流拉流跨平台跨浏览器访问,收集整理了一下相关协 ...
- 网络通信协议篇(一)
网 络 通 信 协 议 概 述 网络通信协议本质上是由一组协议组成的,而协议的本质则是一组规则和规范的组合体.举个例子:两个物流业务点在地域角度看是两个独立的整体,那么要何如对接才能把货物从一点输出到 ...
- java 网络通信协议_JAVA-基础-网络通信协议
通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样.在计算机网络中,这些连接和通信的规则被称为网络通 ...
- 网络编程懒人入门(二):快速理解网络通信协议(下篇)
1.前言 本文上篇<网络编程懒人入门(一):快速理解网络通信协议(上篇)>分析了互联网的总体构思,从下至上,每一层协议的设计思想.基于知识连贯性的考虑,建议您先看完上篇后再来阅读本文. 本 ...
- RTP/RTCP 和 SRTP/SRTCP协议
此文章为转载,如有侵权,通知删除 原地址:https://blog.csdn.net/swallow_he/article/details/74202104 RTP/RTCP 和 SRTP/SRTCP ...
- 网络通信协议是什么?
网络通信基本模式 常见的通信模式有如下2种形式:Client-Server(CS) . Browser/Server(BS) 实现网络编程关键的三要素 IP地址:设备在网络中的地址,是唯一的标识. 端 ...
最新文章
- 利用XML配置实体列表
- java arraylist排序_Java 开发者最容易犯的10个错误【译】
- 天气情况(思维,dp思想)
- 【52】写了placement new也要写placement delete
- CentOS 初体验十七:Nexus发布仓库和引用
- Serverless 落地之痛怎么解?
- ThinkPHP 3.2.3 视图模型的使用
- Java笔记-读取资源文件应该注意的问题(大文件解析、\r\n分割相关的)
- 谷歌、阿里巴巴他们都来了,你呢?
- 接口返回xml格式的数据_接口测试之Jmeter串联xml数据格式请求
- 计算机教师继续教育心得,教师继续教育培训个人心得体会
- 关于宏定义的一些用法
- K3 WISE修改单据表头字段默认值
- UE4材质(四):自发光颜色Emissive——灯
- 03 野火imxull开发板添加 正点原子lcd 支持
- 七大江河水系--海河
- SSM毕设项目超市会员卡管理系统dq469(java+VUE+Mybatis+Maven+Mysql)
- android直播sdk+美颜,直播中有没有美颜SDK有何区别?
- ICSE (2022). Nessie的阅读记录
- 人工智能生成 logo 神器
热门文章
- C语言:36人分配36块砖
- 有关感知器的一个小故事
- mysql 聚集索引 存什么_什么是mysql的聚集索引?
- 数据库中表的常见七大约束
- 安川7系列说明书 安川7系列伺服说明书 安川7系列伺服驱动器手册
- Oracle培训记录
- 2020Android 开发年度总结:“这一年里我到底做了些啥
- 2023东北林业大学计算机考研信息汇总
- COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 80070005 拒绝访问。最新解决方案
- 美团面试题:DCL单例模式需不需要volatile?