- SDP协商SRTP密钥
RFC4568中关于媒体流加密说明时,在SDP中新增了"crypto"字段用于描述加密信息,格式如下:
a=crypto:<tag> <crypto-suite> <key-params> [<session-params>]
其中:
<tag>为十进制数字,用于标记后面所述的加密属性,该数字内容不能为0,在offer/answer的协商模式下,tag用以区分各组备选信息。
<crypto-suite>用于描述加密和认证算法,在offer/answer模式下,本字段参数可协商。
<key-params>反馈crypto-suite字段对应的密钥信息
举例:
crypto:1 AES_CM_128_HMAC_SHA1_80 inline:NHomSmlnXy4qRCwhVi9ANVcwZ3Q3cXVaLykzJ1Rf|2^31|1:1
这里
tag =1
crypto-suite = AES_CM_128_HMAC_SHA1_80 ,支持AES128加密和SHA1_80的Hash
key-params = inline:NHomSmlnXy4qRCwhVi9ANVcwZ3Q3cXVaLykzJ1Rf|2^31|1:1
下面重点介绍下key-params
key-params = <key-method> ":" <key-info>
key-method参数现在只提供一种方式,即“inline”,指示实际密钥信息在key-info字段提供;key-info定义一串字符串,包含Master key、Master salt,可选包含Master key存活时长、Master key索引及长度;在offer/answer协商模式,密钥参数对外公开。
密钥生成规则如下图所示:
例如:AES_CM_128_HMAC_SHA1_80算法套件
Master key:128位(16字节)随机生成;
Master salt :112位(14字节)随机生成 ;
通信双方使用的AES密钥key=base64编码(Master key+ Master salt);
Master key存活时长:一般没有意义,因为默认值很长
MKI:形式为mki_length:mki_value,mki_length是指后面mki_value的实际长度,mki_value用于插入srtp报文中,防破解。
如果没有协商出MKI,则SRTP报文格式如下:
加密报文 | Hash值 |
如果协商出MKI,则SRTP报文格式如下:
加密报文 | MKI_VALUE | Hash值 |
其中MKI_VALUE占的字节数就是MKI_LENGTH
最后加密协商是不对称的,所以本端发出的crypto属性中的加密信息指示的本端发送的码
流的加密信息