RFC4568中关于媒体流加密说明时,在SDP中新增了"crypto"字段用于描述加密信息,格式如下:
a=crypto:<tag> <crypto-suite> <key-params> [<session-params>]
其中:
l tag为十进制数字,用于标记后面所述的加密属性,该数字内容不能为0,在offer/answer的协商模式下,tag用以区分各组备选信息。
l crypto-suite用于描述加密和认证算法,在offer/answer模式下,本字段参数可协商。
l 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定义一串字符串,包含主密钥、主salt密钥,可选包含主密钥存活时长、主密钥索引及长度;在offer/answer协商模式,密钥参数对外公开。
主密钥:128位随机生成(范围【0-9,a-z】),进行Base64位编码
主salt密钥:112位随机生成(范围【0-9,a-z】),进行Base64位编码
主密钥和主salt密钥用于后面rtp进行AES加密的key+salt key,这里通信双方告诉对端自己接受码流的主密钥和主salt密钥
主密钥存活时长:一般没有意义,因为默认值很长
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属性中的加密信息指示的本端发送的码流的加密信息