srt协议详解,srtp好过吗

概要1

随着网络技术的发展和标准的制定,实时音频、视频的应用越来越广泛,这些应用反而促进了相关协议标准的发展。 1996年IETF在RFC1889上定义了传输实时数据的互联网标准协议RTP,并于2003年制定了RFC3550的升级版。由于网络安全问题日益突出,2004年3月IETF在RFC3711中定义了RTP的一个扩展协议SRTP来提高RTP应用的安全性,SRTP定义了对RTP与RTCP流进行加密、认证以及抗重播攻击检测等的实现框架。二简介

SRTP SRTCP

安全的实时传输协议(安全实时传输协议或SRTP )是基于实时传输协议(实时传输协议或RTP )定义的由David Oran (思科)和Rolf Blom (爱立信)开发,由IETF用于在单播和多播APP应用中为实时传输协议提供数据加密和消息验证由于实时传输协议与可用于控制实时传输协议会话的实时传输控制协议(RTP控制协议或RTCP )密切相关,因此也存在安全的实时传输协议安全实时传输控制协议提供与实时传输控制协议类似的安全相关特性,就像安全实时传输协议为实时传输协议提供的一样。

在使用实时传输协议或实时传输控制协议的情况下,可选地不使用安全的实时传输协议或安全的实时传输控制协议; 但是,即使使用了安全实时传输协议或安全实时传输控制协议,也可以选择提供所有功能,包括加密和验证,并且可以单独使用和禁用这些功能。 唯一的例外是,使用安全的实时传输控制协议时,必须使用消息验证功能。

为了提供数据流的保密,需要对数据流进行加密和解密。 在这方面,安全实时传输协议(结合安全实时传输控制协议)只是AES制定使用标准的加密算法之一。 该加密算法有两种加密模式,将原始AES块密文转换为流密文。 分割整数计数器模式和f8模式。

在安全的实时传输协议中,除了AES加密算法之外,还可以完全禁用加密。 在这种情况下,使用所谓的“零加密算法”。 这可被认为是安全实时传输协议所支持的第二加密算法,或所支持的第三加密模式。 事实上,零加密算法没有加密任何东西。 也就是说,加密算法将私钥流视为只包含“0”的流,并将输入流按原样复制到输出流中。 此模式必须在所有与安全实时传输协议兼容的系统上实现。 这是因为安全的实时传输协议不需要提供机密性保证,而只需要验证和消息完整性等其他特性时可以使用。

上述的加密算法本身不保护消息的完整性,攻击者可以伪造数据——至少播放过去传输的数据。 因此,安全的实时传输协议标准还提供了保护数据完整性和防止播放的方法。

为了进行消息认证和保护消息的完整性,安全的实时传输协议使用了HMAC-SHA1算法。 该算法使用默认的160位长的HMAC-SHA1认证密钥。 但是无法抵抗播放攻击的播放方法建议收件人保留以前接收的邮件的索引,将它们与每个新接收的邮件进行匹配,并且只接收过去未播放的新邮件。 该方法在很大程度上依赖于完整性保护的使用。 这样可以防止非法使用消息索引。

三协议数据消息结构数据消息包括报头、数据主体和认证信息三部分。

(1) 32位:

V 2bits版本号,现在是版本2

如果负载长度小于32比特的整数倍,则需要p 1比特填充比特

x 1位扩展位,在1的情况下,在固定标题后添加32位扩展(RTP扩展)

CC 4bits CSRC的数量

le=”border:0px;line-height:21px;”>M 1bit 允许在比特流中标记重要的事件

PT 7bits 负载类型

序列号16bits   每发送一个RTP数据包,序列号加1,根据此来判断序列号的顺序

(2)时间戳 32bits

(3)SSRC标识符 32bits synchronizating source identifier 识别同步源

(4)CSRC标识符 n个32bits contributing source identifiers 识别负载重的有效贡献源

(5)可选存在的RTP extension

(6)加密的payload(末尾可能包含RTP padding和RTP pad count)

(7)包尾是SRTP MKI(可选),master key identifier,是用来生成session加密密钥的随机位串标识符。

(8)认证标签(Authentication tag)

与RTP包的主要区别是负载加密、SRTP MKI(主密钥标识符,由密钥管理协议决定)、认证标签。

3、协议的工作流程

(1)协议中涉及哪些密钥和重要参数

主密钥 master key

主密钥是一个长度不定的随机位串,用来生成会话密钥

会话密钥 session key

会话密钥就是用于消息加密和认证的密钥

master salt 不知道怎么翻译

salt是指一种在生成会话密码时的输入参数,salt增加了字典式攻击的难度,每增加1bit的salt,就会使字典攻击的难度和时间翻倍。

key_derivation_rate

生成会话密钥的速率,必须是{1,2,4,……2^24}中的一个,必须为2的幂数

 

<from,to>

这是两个48bits的时间值,表示master key的有效时间。

ROC(rollover counter)

记录序列号的重置次数,用来计算SRTP包的索引

Index = 2^16 * ROC + SEQ

(2)会话密钥的产生

 

 

在协议中,密钥生成过程的描述是通过数学函数来说明的,如下:

 

 

 

key_session = PRF (key_master, x);

r = index/key_derivation_rate;;//label长度8位

key_id = <label> || r;

x = key_id XOR master salt;

PRF是一个AES-cm的对称加密函数。

用框图表示,如下:

 

其中,IV=[ <label>||(index/key_derivation_rate)XOR master_salt ]*2^16

index=2^16*ROC+SEQ

对于生成的不同密钥,8位的label有不同的值:

session_en_key:消息加密密钥,<label>=0x00

session_au_key:消息认证密钥,<label>=0x01

session_salt_key:会话salt,<label>=0x02

 

(3)具体工作流程

得到会话密钥后,就可以对消息载荷进行安全操作了。

发送方工作流程:

1)确定加密上下文

2)根据ROC、加密上下文中的最高序列号以及RTP包中的序列号,确定SRTP包索引

index=2^16*ROC+SEQ

3)根据index确定master_key和master_salt(需要密钥管理协议)

4)根据密钥管理协议中的各个参数,通过密钥生成器,得到会话密钥

5)利用会话密钥和传输参数设定,对载荷进行加密,作为数据包中的加密载荷

6)如果MKI字段为1,则加入MKI字段

7)计算认证标签,并加在包尾

8)更新ROC和数据包索引

接收端流程

1)确定加密上下文

2)计算包索引

index=2^16*v+SEQ

v={ROC-1,ROC,ROC+1}/2^32

3)如果MKI字段为1,则根据MKI确定主密钥和主密钥salt,否则用index确定主密钥和salt

4)得到会话密钥

5)重播检查,利用index和重播列表来检查重播,如果为重播数据包,则丢弃,并记录log。

执行认证过程,如果不匹配,则丢弃,并记录log。

6)利用会话密钥解密数据载荷

7)根据index,更新ROC、最大序列号、加密上下文中的s_l值,需要时更新重播列表。

8)从数据包中删除MKI和认证标签。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注