WebRTC 传送安全性体制第二话:深入显出 SRTP 协议书

根据 DTLS 商议后,RTC 通讯的彼此进行 MasterKeyMasterSalt 的商议。下面,大家再次剖析在 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 框架图中能够见到:

  1. 数据加密一部分 Encrypted Portion,由 payload, RTP paddingRTP pad count 一部分构成。也就是大家一般 常说的仅对 RTP 负荷数据库加密。

  2. 必须校检一部分 Authenticated Portion,由 RTP Header, RTP Header extensionEncrypted Portion 一部分构成。

一般 状况下只必须对 RTP 负荷数据信息开展数据加密,假如必须对 RTP header extension 开展数据加密,RFC6904 得出了详尽计划方案,在 libsrtp 中也完成了完成。

SRTCP 构造

SRTCP 框架图中能够见到:

  1. 数据加密一部分 Encrypted Portion,为 RTCP Header 以后的一部分,对 Compound RTCP 也是一样。

  2. E-flag 显式得出了 RTCP 包是不是数据加密。(PS:一个 RTP 包怎么判断是数据加密的?)

  3. SRTCP index 表明得出了 RTCP 包的系列号,用于防中间人攻击。(PS:一个 RTP 包的 16-bits 的系列号能够防中间人攻击吗?)

  4. 待校检一部分 Authenticated Portion,由 RTCP HeaderEncrypted Portion 一部分构成。

在基本了解了 SRTPSRTCP 的构造后,下面详细介绍 Encrypted PortionAuthenticated 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

相匹配的 KDFAES128_CMSession 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 种状况:

  1. v = ROC - 1, ROC 和 s_l 不升级。

  2. v = ROC,假如 SEQ > s_1,则升级 s_l = SEQ。

  3. 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 种说明:

  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。不然表明接到一个乱序包。

下面的图更为形象化表明防中间人攻击的三个地区:

SRTP-WINDOW-SIZE 的赋值,最少是 64。运用能够依据必须设成很大的值,libsrtp 会向上取整为 32 的非负整数。比如,在 WebRTC 中 SRTP-WINDOW-SIZE = 1024。使用人能够依据必须开展调节,但要做到防中间人攻击的目地。

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 - 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-ICMAES_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:异或运算。

  • :意味着 "联接" 计算。

测算流程以下:

  1. 将 0x00 添充到 K 的后边,直至其长短相当于 B。

  2. 将流程 1 的結果跟 ipad 做异或运算。

  3. 即将数据加密的信息内容附在流程 2 的結果后边。

  4. 启用 H 方式。

  5. 将流程 1 的結果跟 opad 做异或运算。

  6. 将流程 4 的結果附在流程 5 的結果后边。

  7. 启用 H 方式。

SRTPSRTCP 测算 Authentication tag,应用的 K 相匹配 Key 管理方法一部分叙述的 RTP auth keyRTCP auth key,应用的 Hash 优化算法为 SHA-1Authentication tag 的长短为 80-bits。

在预估 SRTP 的,要验证的內容 M 为:

M = Authenticated Portion   ROC

在其中, 意味着 "联接" 计算,Authenticated PortionSRTP 的框架图中得出。

在预估 SRTCP 时,要验证的內容 M 为:

M=Authenticated Portion

在其中,Authenticated PortionSRTCP 的框架图中得出。

根据应用 Authenticated Portion 优化算法,测算获得 SRTP/SRTCPEncrypted Portion Portion 一部分。

AES—GCM

AES-GCM 应用电子计数器方式来数据加密数据信息,该实际操作能够合理地生产流水线化,GCM 身份认证应用的实际操作尤其合适于硬件配置中的合理完成。在 GCM-SPEC  详细描述了 GCM 的基础知识, Section4.2 Hardware  详细描述了硬件配置完成。

AES-GCMSRTP 数据加密中的运用,在 RFC7714  开展了详细说明。Key 管理方法和系列号管理方法与文中中叙述的同样,必须留意的是:

  1. AES-GCM 做为一种 AEAD(Authenticated Encryption with Associated Data)加密技术,键入和輸出是啥,相匹配到 SRTP/SRTCP 的包构造中了解。

  2. Counter 的是测算方法和 AES-ICM 中叙述的测算方法不一样,必须重点关注。

libsrtp  早已完成了 AES-GCM,有兴趣爱好的同学们,能够融合编码开展细读。

libsrtp 的应用

libsrtp 是被普遍应用的 SRTP/SRTCP 数据加密的开源软件。常常采用的 api 以下:

  1. srtp_init,复位 srtp 库,复位內部加密技术,在应用 srtp 前,务必要启用了。

  2. srtp_create, 建立 srtp_session,能够融合文中中详细介绍的 session,session key 等定义一起了解。

  3. srtp_unprotect/srtp_protect,RTP 包加解密插口。

  4. 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 中应用这一构造。下列主要参数必须关心:

  1. DTLS 商议后获得的 MasterKeyMasterSalt 根据这一构造传送给 libsrtp,用以 session key 的转化成。

  2. window_size,相匹配大家以前叙述的 srtp 防中间人攻击的对话框尺寸。

  3. allow_repeat_tx,是不是容许重新传输同样编号的包。

SRS 是一个新一代即时通讯网络服务器,对 libsrtp 有兴趣的同学们,能够迅速在该设备架起调节自然环境,开展有关检测,更为深层次了解有关的优化算法。

汇总

文中根据对 SRTP/SRTCP 有关基本原理的深层次详尽讲解,对 libsrtp 应用碰到的难题开展解释,期待可以给即时音频视频通讯的有关行业的同学们以协助。

论文参考文献

  1. RFC3711:  SRTP

  2. RFC6904: Encrypted SRTP Header Extensions

  3. Integer Counter Mode

  4. RFC-6188: The Use of AES-192 and AES-256 in Secure RTP

  5. RFC7714:  AES-GCM for SRTP

  6. RFC2104:  HMAC

  7. RFC2202: Test Cases for HMAC-MD5 and HMAC-SHA-1

  8. GCM-SPEC:  GCM

评论(0条)

刀客源码 游客评论