背景
1、一路直播数据流从客户推流产生媒体数据,直到其它客户进行播放,中间经过各种服务器和防火墙的转发,如果出现dns劫持等中间人攻击的情况,视频流内容会被篡改而不自知。因此通常使用全链路数据加密,或者秘钥机制加密数据等方式来进行防篡改。
2、当前方案存在如下问题:
2.1 使用全链路加密时,在推拉流的每个层级都需要做加解密的动作,从而引入了播放延迟。
2.2 使用秘钥加密标志位的方法进行防篡改,则需要提前进行秘钥分发,这会增加直播的复杂性和成本。
方案
通过增加校验参数来进行篡改识别。包含两个字段,哈希值和随机数。两个字段是跟随关键帧(RTMP/FLV拉流)或者每片数据(ts片的参数)发布的。对关键帧或者数据片加上随机数使用sha256进行计算,结果符合哈希值的,则认为没有篡改。
当哈希值和与之匹配的随机数在同一段数据中进行发送时,篡改方会在篡改数据的同时,使用自己重新计算的随机数和哈希值进行替换从而使该机制失效。如果把需要参与计算的随机数放在下一次发送的校验数据中,篡改时无法提前知晓。但篡改方可以通过缓存下一次数据,获取到随机数之后再进行篡改。如果把参与计算的随机数再扩大一帧数据,篡改方就需要再多缓存一次数据。按照普通直播平均10秒的缓存数据,每个gop3秒来计算,连续4次的随机数参与计算,进行篡改时引入的时延就会过大导致直播无数据断流。
参与计算的随机数序列越长,则破解需要引入的时延越长,安全性越高。但同时识别出是否篡改的时间也会变长。
示例
1 每个数据包包含三个部分,媒体数据帧,哈希值和nonce值。
2 当使用两个序列作为校验值时,哈希值1由数据帧1+nonce2+nonce3做哈希产生,nonce2的值在下一个关键帧中发送,nonce3是在下下次。
3 对任意数据包的内容进行修改,都会造成之前或者之后的哈希值无法匹配,从而识别出篡改。
4 破解方式需要中断直播流,并且缓存够两个序列后再进行篡改。所以当序列长度大于直播的时延需求,如10~30秒的时间,破解行为就会被轻易识别出来。