WebRTC 传送安全性体制第二话:深入显出 SRTP 协议书
根据 DTLS 商议后,RTC 通讯的彼此进行
MasterKey
和MasterSalt
的商议。下面,大家再次剖析在 WebRTC 中,怎么使用互换的密匙,来对 RTP 和 RTCP 开展数据加密,完成数据信息的安全性传送。与此同时,文中会对 libsrtp 应用中,碰到的难题的开展解释,比如,什么叫 ROC,ROC 为什么是 32-bits?怎么会回到 error_code=9, error_code=10?互换的密匙有生命期吗,如果有是多久呢?阅读文章这篇以前提议阅读文章 DTLS 商议篇,二者融合,实际效果更好哦!
创作者|进学
校审|泰一
要处理的难题
RTP/RTCP
协议书并沒有对它的负荷数据信息开展一切维护。因而,假如网络攻击根据抓包软件,如 Wireshark,将音频视频数据收集到后,根据该专用工具就可以立即将音频视频流播放出来,它是十分可怕的事儿。
在 WebRTC 中,为了更好地避免这类事儿产生,沒有立即应用 RTP/RTCP
协议书,只是应用了 SRTP/SRTCP
协议书 ,即安全性的 RTP/RTCP
协议书。WebRTC 应用了十分知名的 libsrtp 库将原先的 RTP/RTCP
协议书数据交换成 SRTP/SRTCP
协议书数据信息。
SRTP 要处理的难题:
-
对
RTP/RTCP
的负荷 (payload) 开展数据加密,确保网络信息安全; -
确保
RTP/RTCP
包的一致性,与此同时防中间人攻击。
SRTP/SRTCP 构造
SRTP 构造
从 SRTP 框架图中能够见到:
-
数据加密一部分
Encrypted Portion
,由payload
,RTP padding
和RTP pad count
一部分构成。也就是大家一般 常说的仅对 RTP 负荷数据库加密。 -
必须校检一部分
Authenticated Portion
,由RTP Header
,RTP Header extension
和Encrypted Portion
一部分构成。
一般 状况下只必须对 RTP 负荷数据信息开展数据加密,假如必须对 RTP header extension 开展数据加密,RFC6904 得出了详尽计划方案,在 libsrtp 中也完成了完成。
SRTCP 构造
从 SRTCP
框架图中能够见到:
-
数据加密一部分
Encrypted Portion
,为RTCP Header
以后的一部分,对Compound RTCP
也是一样。 -
E-flag 显式得出了 RTCP 包是不是数据加密。(PS:一个 RTP 包怎么判断是数据加密的?)
-
SRTCP index
表明得出了 RTCP 包的系列号,用于防中间人攻击。(PS:一个 RTP 包的 16-bits 的系列号能够防中间人攻击吗?) -
待校检一部分
Authenticated Portion
,由RTCP Header
和Encrypted Portion
一部分构成。
在基本了解了 SRTP
和 SRTCP
的构造后,下面详细介绍 Encrypted Portion
和 Authenticated Portion
怎样获得了。
Key 管理方法
在 SRTP/SRTCP
协议书中,应用二元组 <SRTP目地IP地址,SRTP/SRTCP目地端口号>
的方法来标志一个通讯参加者的 SRTP/SRTCP
对话,称之为 SRTP/SRTCP Session
。
在 SRTP 协议书中应用三元组<SSRC, RTP/RTCP目地详细地址,RTP/RTCP目地端口号>
来标志一个 stream,一个 SRTP/SRTCP Session
由好几个 stream 构成。对每一个 stream 的加解密有关主要参数的叙述,称之为 Cryptographic Context
。
每一个 stream 的 Cryptographic Context
中 中的包括以下主要参数:
-
SSRC: Stream 应用的 SSRC。
-
Cipher Parameter:加解密应用的 key, salt,优化算法叙述 (种类,主要参数等)。
-
Authentication Parameter: 一致性应用的 Key, salt,优化算法叙述 (种类,主要参数等)。
-
Anti-Replay Data: 避免中间人攻击缓存文件的数据信息,比如,ROC,较大编号等。
在 SRTP/SRTCP Session
中,每一个 Stream 都是会应用到归属于自身的,加解密 Key,Authentication Key。这种 Key 全是在同一个 Session 中应用到的,称之为 Session Key
。这种 Session Key
是根据对 Master Key
应用 KDF (Key Derivation Function) 导出来的。
KDF
是用以导出来 Session Key
涵数,KDF 默认设置应用是加解密涵数。比如,在进行 DTLS 后,商议获得的 SRTP 加密技术的 Profile 为:
SRTP_AES128_CM_HMAC_SHA1_80 cipher: AES_128_CM cipher_key_length: 128 cipher_salt_length: 112 maximum_lifetime: 2^31 auth_function: HMAC-SHA1 auth_key_length: 160 auth_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:是异或运算,测算时依照低字节位两端对齐。
下列应用 AES128_CM
,举例子 Session Key
的导出来全过程,假定 DTLS 商议获得:
master_key: E1F97A0D3E018BE0D64FA32C06DE4139 // 128-bits master_salt: 0EC675AD498AFEEBB6960B3AABE6 // 112-bits
导出来数据加密 Key (cipher key):
packet_index/kdr: 000000000000 label: 00 master_salt: 0EC675AD498AFEEBB6960B3AABE6 ----------------------------------------------- xor: 0EC675AD498AFEEBB6960B3AABE6 (x, KDF input) x*2^16: 0EC675AD498AFEEBB6960B3AABE60000 (AES-CM input) cipher key: C61E7A93744F39EE10734AFE3FF7A087 (AES-CM output)
导出来 SALT Key (cipher salt):
packet_index/kdr: 000000000000 label: 02 master_salt: 0EC675AD498AFEEBB6960B3AABE6 ---------------------------------------------- xor: 0EC675AD498AFEE9B6960B3AABE6 (x, KDF input) x*2^16: 0EC675AD498AFEE9B6960B3AABE60000 (AES-CM input) 30CBBC08863D8C85D49DB34A9AE17AC6 (AES-CM ouptut) cipher salt: 30CBBC08863D8C85D49DB34A9AE1
导出来校检 Key (auth key),必须 auth key
长短为 94 字节数:
packet_index/kdr: 000000000000 label: 01 master salt: 0EC675AD498AFEEBB6960B3AABE6 ----------------------------------------------- xor: 0EC675AD498AFEEAB6960B3AABE6 (x, KDF input) x*2^16: 0EC675AD498AFEEAB6960B3AABE60000 (AES-CM input) auth key AES input blocks CEBE321F6FF7716B6FD4aB49AF256A15 0EC675AD498AFEEAB6960B3AABE60000 6D38BAA48F0A0ACF3C34E2359E6CDBCE 0EC675AD498AFEEAB6960B3AABE60001 E049646C43D9327AD175578EF7227098 0EC675AD498AFEEAB6960B3AABE60002 6371C10C9A369AC2F94a8C5FBCDDDC25 0EC675AD498AFEEAB6960B3AABE60003 6D6E919A48B610EF17C2041E47403576 0EC675AD498AFEEAB6960B3AABE60004 6B68642C59BBFC2F32DB60DBDFB2 0EC675AD498AFEEAB6960B3AABE60005
AES-CM 的详细介绍,参照 AES-CM。
到此,大家获得了 SRTP/SRTCP
数据加密和验证必须的 Session Key
:cipher key,auth key,salt key。
系列号管理方法
SRTP 系列号管理方法
在 RTP
包构造界定中应用 16-bit 来叙述系列号。充分考虑防中间人攻击,信息一致性校检,数据加密数据信息,导出来 SessionKey
的必须,在 SRTP
协议书中,SRTP 包的系列号,应用隐式方法来纪录包系列号 packet_index
,应用 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
开展较为,那一个更贴近,v 就取相匹配的值。进行 SRTP 破译和一致性校检后,升级 ROC 和 s_l,分以下 3 种状况:
-
v = ROC - 1, ROC 和 s_l 不升级。
-
v = ROC,假如 SEQ > s_1,则升级 s_l = SEQ。
-
v = ROC 1, ROC = v = ROC 1,s_l = SEQ。
更形象化的编码叙述:
if (s_l < 32768) if (SEQ - s_l > 32768) set v to (ROC-1) mod 2^32 else set v to ROC endif else if (s_l - 32768 > SEQ) set v to (ROC 1) mod 2^32 else set v to ROC endif endif return SEQ v*65536
SRTCP 系列号管理方法
RTCP
中沒有叙述编号的字段名,SRTCP
的编号在 SRTCP 包,应用 31-bits
中表明叙述,详细 SRTCP 文件格式,换句话说在 SRTCP 的较大系列号为 2^31。
系列号与通讯时间
能够见到 SRTP 的系列号最高值为 2^48, SRTCP 的系列号最高值为 2^16。在大部分运用中(假定每 128000 个 RTP 数据文件最少有一个 RTCP 数据文件),SRTCP 编号将最先做到限制。以 200 SRTCP 数据文件 / 秒的速率, SRTCP 的 2^31 系列号室内空间足够保证大概 4 个月的通讯。
防中间人攻击
网络攻击将捕获的 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 种说明:
-
delta > 0:表明收到了新的包。
-
delta <-(SRTP-WINDOW-SIZE - 1) < 0:表明接到的包的系列号,低于播放对话框规定的最少编号。libSRTP 接到那样的包时,会回到
srtp_err_status_replay_old=10
, 表明接到旧的播放包。 -
delta <0, delta>= -(SRTP-WINDOW-SIZE - 1)
: 表明收到了播放对话框以内的包。假如在 ReplayList 寻找相匹配的包,则是一个 index 反复的播放包。libSRTP 接到那样的包时,会回到srtp_err_status_replay_fail=9
。不然表明接到一个乱序包。
下面的图更为形象化表明防中间人攻击的三个地区:
SRTP-WINDOW-SIZE 的赋值,最少是 64。运用能够依据必须设成很大的值,libsrtp 会向上取整为 32 的非负整数。比如,在 WebRTC 中
SRTP-WINDOW-SIZE = 1024
。使用人能够依据必须开展调节,但要做到防中间人攻击的目地。
SRTCP 防中间人攻击
在 SRTCP 中,packet index 显式得出。在 libsrtp 中,SRTCP 的防中间人攻击的对话框尺寸为 128。应用 window_start
纪录防中间人攻击的起止系列号。SRTCP 防中间人攻击的查验流程以下:
-
index > window_start 128: 接到新的
SRTCP
包。 -
index < window_start: 接到包的系列号在播放对话框的左边,能够觉得大家收到了较为老的包。libsrtp 接到那样的包以后,会回到到
srtp_err_status_replay_old=10
。 -
replay_list_index = index - windwo_start:在 ReplayList 中 replay_list_index 相匹配的标志位为 1,表明早已接到包,libsrtp 回到
srtp_err_status_replay_fail=9
。相匹配的标志位为 0,表明接到乱序包。
数据加密和校验优化算法
在 SRTP 中,应用了 CTR(Counter mode)方式的 AES 加密技术,CTR 方式根据增长一个数据加密电子计数器以造成持续的密钥流,电子计数器能够是随意确保长期不造成反复輸出的密匙。依据记数方法的不一样,分成下列二种种类:
-
AES-ICM
: ICM 方式(Integer Counter Mode,整数金额记数方式),应用整数金额记数计算。 -
AES-GCM
: GCM 方式(Galois Counter Mode,根据伽罗瓦域记数方式),记数计算界定在伽罗瓦域。
在 SRTP 中,应用 AES-ICM
进行加密技术,与此同时应用 HMAC-SHA1
进行 MAC
测算,对数据信息开展一致性校检,数据加密和 MAC
测算必须分二步进行。AES-GCM
根据 AEAD(Authenticated-Encryption with Associated-Data,关联数据的验证数据加密)的观念,在对数据信息开展数据加密的与此同时测算 MAC
值,完成了一个流程,进行数据加密和校验信息内容的测算。下边各自对这一 AES-ICM
和 AES_GSM
的使用方法开展详细介绍。
AEC—ICM
图中叙述了 AES-ICM
的数据加密和破译全过程,图上的 K
是根据 KDF 导出来的 SessionKey
。数据加密和数据加密全是根据对 Counter 开展数据加密,与密文 P 异或运算获得数据加密数据信息 C,相反,与保密 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 |<-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
在其中,b_c
是 Counter 的记数,原始 b_c
的赋值为 0,相匹配 Counter 0, 每数据加密 128-bits 数据信息,b_c
提升 1,做为下一个 Counter。依据一个 RTP 包的 index,SSRC 推算出来的 Counter,构成了 keystream,每一个 Counter 是一个 keystream block。
根据应用 AES-ICM
优化算法,对 RTP/RTCP
的负荷开展数据加密获得了 Encrypted Portion Portion
一部分。
HMAC—SHA1
散列信息验证码(Hash-based message authentication code,简称为 HMAC),是一种根据尤其测算方法以后造成的信息验证码(MAC),应用登陆密码散列函数,与此同时融合一个数据加密密匙,它能够用于确保数据的一致性,与此同时能够用于作某一信息的身份认证。HMAC 根据一个规范优化算法,在预估hach的全过程中,把 key 渗入测算全过程中。HMAC 的数据加密完成以下:
HMAC(K,M) = H ( (K XOR opad ) H( (K XOR ipad ) M ) )
-
H:hash 优化算法,例如,MD5,SHA-1,SHA-256。
-
B:块字节数的长短,块是 hash 实际操作的基本要素。这儿 B=64。
-
L: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:外界添充变量定义,是 c04C 反复 B 次。
-
ipad:內部添充变量定义,是 c036 反复 B 次。
-
XOR:异或运算。
-
:意味着 "联接" 计算。
测算流程以下:
-
将 0x00 添充到 K 的后边,直至其长短相当于 B。
-
将流程 1 的結果跟 ipad 做异或运算。
-
即将数据加密的信息内容附在流程 2 的結果后边。
-
启用 H 方式。
-
将流程 1 的結果跟 opad 做异或运算。
-
将流程 4 的結果附在流程 5 的結果后边。
-
启用 H 方式。
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
在其中,
意味着 "联接" 计算,Authenticated Portion
在 SRTP
的框架图中得出。
在预估 SRTCP
时,要验证的內容 M 为:
M=Authenticated Portion
在其中,Authenticated Portion
在 SRTCP
的框架图中得出。
根据应用 Authenticated Portion
优化算法,测算获得 SRTP/SRTCP
的 Encrypted Portion Portion
一部分。
AES—GCM
AES-GCM
应用电子计数器方式来数据加密数据信息,该实际操作能够合理地生产流水线化,GCM 身份认证应用的实际操作尤其合适于硬件配置中的合理完成。在 GCM-SPEC 详细描述了 GCM 的基础知识, Section4.2 Hardware 详细描述了硬件配置完成。
AES-GCM
在 SRTP
数据加密中的运用,在 RFC7714 开展了详细说明。Key 管理方法和系列号管理方法与文中中叙述的同样,必须留意的是:
-
AES-GCM
做为一种AEAD(Authenticated Encryption with Associated Data
)加密技术,键入和輸出是啥,相匹配到SRTP/SRTCP
的包构造中了解。 -
Counter
的是测算方法和 AES-ICM 中叙述的测算方法不一样,必须重点关注。
libsrtp 早已完成了 AES-GCM
,有兴趣爱好的同学们,能够融合编码开展细读。
libsrtp 的应用
libsrtp 是被普遍应用的 SRTP/SRTCP
数据加密的开源软件。常常采用的 api 以下:
-
srtp_init
,复位 srtp 库,复位內部加密技术,在应用 srtp 前,务必要启用了。 -
srtp_create
, 建立 srtp_session,能够融合文中中详细介绍的 session,session key 等定义一起了解。 -
srtp_unprotect/srtp_protect
,RTP 包加解密插口。 -
srtp_protect_rtcp/srtp_unprotect_rtcp
,RTCP 包的加解密插口。
5.srtp_set_stream_roc/srtp_get_stream_roc
, 设定和获得 stream 的 ROC,这两个插口在全新的 2.3 版本号添加。
关键的构造 srtp_policy_t
,用于复位加解密主要参数,在 srtp_create
中应用这一构造。下列主要参数必须关心:
-
DTLS 商议后获得的
MasterKey
和MasterSalt
根据这一构造传送给 libsrtp,用以 session key 的转化成。 -
window_size
,相匹配大家以前叙述的 srtp 防中间人攻击的对话框尺寸。 -
allow_repeat_tx
,是不是容许重新传输同样编号的包。
SRS 是一个新一代即时通讯网络服务器,对 libsrtp 有兴趣的同学们,能够迅速在该设备架起调节自然环境,开展有关检测,更为深层次了解有关的优化算法。
汇总
文中根据对 SRTP/SRTCP
有关基本原理的深层次详尽讲解,对 libsrtp 应用碰到的难题开展解释,期待可以给即时音频视频通讯的有关行业的同学们以协助。
论文参考文献
-
RFC3711: SRTP
-
RFC6904: Encrypted SRTP Header Extensions
-
Integer Counter Mode
-
RFC-6188: The Use of AES-192 and AES-256 in Secure RTP
-
RFC7714: AES-GCM for SRTP
-
RFC2104: HMAC
-
RFC2202: Test Cases for HMAC-MD5 and HMAC-SHA-1
-
GCM-SPEC: GCM
1.本站大部分内容均收集于网络!若内容若侵犯到您的权益,请发送邮件至:duhaomu@163.com,我们将第一时间处理!
2.资源所需价格并非资源售卖价格,是收集、整理、编辑详情以及本站运营的适当补贴,并且本站不提供任何免费技术支持。
3.所有资源仅限于参考和学习,版权归原作者所有,更多请阅读网站声明。