流媒体基础实践之——打流直播码安全保护(安全防盗链)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 功能介绍      所谓安全防盗链,是一种加了防盗链签名的URL,经过签名的URL能够跟阿麦打流服务器的安全机制进行配合,可以将URL的使用权限定在您的APP上,恶意第三方拿到URL也不能使用和传播。

功能介绍

     所谓安全防盗链,是一种加了防盗链签名的URL,经过签名的URL能够跟阿麦打流服务器的安全机制进行配合,可以将URL的使用权限定在您的APP上,恶意第三方拿到URL也不能使用和传播。

(1)推流 - 推流URL加防盗链的必要性极高,尤其是在直播码跟用户ID(或者DB ID)绑定的情况下,因为客户的直播码ID很容易被攻击者窃取,进而伪装客户自己进行抢占式推流,所以为推流URL增加防盗链签名,确保只有真正的客户主人自己才能在登录后拿到防盗链签名非常有必要。

(2)播放 - 播放URL加防盗链并不是100%必要的,只有在您的视频源是热门资源时(比如某个独家的赛事直播)才比较有价值,因为您要防止您的竞争对手拿到播放地址后在自家的APP里上架这个节目。播放地址防盗链引入后的副作用就是播放时可能需要申请防盗链签名,导致直播打开速度不稳定。

原理介绍

下图都是典型的安全防盗URL,您会发现这些地址都有一个共同的特点,就是在原来的推流或者播放地址后拼接txSecret和txTime参数。

AMAI打流全地址:rtmp://120.26.206.180/live/test?username=123456&password=123456
OBS打流:rtmp://120.26.206.180/live
KEY字符串:test?username=123456&password=123456
test?username=tinywan&password=123456&sign=8935737e61b6fdd586cdab3b15d79633
剔流地址:http://120.26.206.180/rtmp/controllortnoc/drop/client?app=live&name=tinywan

安全防护链的构建:

rtmp://120.26.206.180/live/100022_test111?tokenSecret=c7707f5550076bd1c731db0c94ed9366&tokenTime=579ACB15

txTime声明了该播放器的有效时间,比如5分钟,当这个地址在5分钟后被再次使用时,阿麦打流服务器将会判定其为过期地址而拒绝服务。

     但我们知道,简单声明txTime是没有意义的,因为任何攻击者都可以在一个窃取的URL后面拼接上一个声明100天过期的txTime,所以腾讯云需要有一种安全措施确保攻击者无法伪造txTime,这个安全措施就是txSecret。

txSecret是您的服务器计算出来的一个安全签名,计算公式是:txSecret = MD5( KEY + stream_id + txTime )

  • KEY
    需要您跟阿麦打流服务器在控制台上提交或者兑换的安全密钥,您应当确保除了您和阿麦打流服务器之外,外部无法获知,而且最好定期更换。

  • stream_id
    即直播码,当同时在线的主播比较多的时候,txTime 很容易碰撞,所以加入 stream_id 来防碰撞。

  • MD5
    最著名的单向不可逆HASH算法了,因为不可逆性,所以攻击者无法根据txSecret逆向计算出KEY,也就无法根据自己伪造的txTime计算出一个可以通过腾讯云验证的txSecret来。

合成方法

安全防盗链机制需要您的服务器和阿麦打流服务器协同才能完成,如下图:

【1】step1 - 交换秘钥
     首先,您需要在官网的控制台,协商一个加密密钥,这个加密密钥用于在您的服务器上生成防盗链签名,由于阿麦打流服务器跟您持有同样的密钥,所以您生成的防盗链签名,阿麦打流服务器是可以进行解密确认的。

加密秘钥分为推流防盗链KEY和播放防盗链KEY,前者用于生成推流防盗链URL,后者用于生成播放防盗链URL。目前在上可以自助配置推流防盗链KEY,如下图:

 

播放防盗链KEY由于同步周期长,不适合调试期频繁修改,如您需要配置请联系我们。

【2】step2 - 生成txTime
      签名中明文部分为txTime,含义是该链接的有效期,比如现在我当前的时间是2016-07-29 11:13:45,而且期望新生成的URL是在5分钟后即作废,那么txTime就可以设置为 2016-07-29 11:18:45。

      不过这么长一串时间字符串放在URL里显然不太“经济”,实际适用中,我们是把 2016-07-29 11:18:45 转换成Unix时间戳,也就是1469762325 (转换方式各种后台编程语言都由直接可用的时间函数来处理),然后转换成16进制,也就是 txTime=579ACB15。

   /**
     * tokenTime
     * $currentTime :开始时间
     */
    public function getTokenTime($currentTime , $expireTime)
    {
        $tokenTime = dechex(strtotime($currentTime)+$expireTime);
        return strtoupper($tokenTime);
    }

【3】 step3 - 生成txSecret
       txSecret的生成方法是 = MD5(KEY+ stream_id + txTime),这里的 KEY 就是您在Step1中跟腾讯云交换的加密密钥,stream_id在本例中为 8888_test001,txTime为刚才计算的579ACB15,MD5即标准的MD5单向不可逆哈希算法。

    /**
     * tokenSecret
     * 顺序:MD5(KEY+ streamId + txTime)
     * @param int $streamId
     * @param string $currentTime
     * @param string $expireTime
     * @return string
     */
    public function getTokenSecret($tokenTime,$streamId,$tokenTime)
    {
        $KEY = '8935737e61b6fdd586cdab3b1';
        $tokenSecret = md5($KEY . $streamId . $tokenTime);
        return $tokenSecret;
    }

 【4】step4 - 合成防盗链地址
现在我们有了推流(或者播放)URL,有了用来告知腾讯云该URL过期时间的txTime,有了只有腾讯云才能解密并且验证的txSecret,就可以拼合成一个防盗链的安全URL了。

 

public function indexAction()
    {
        $this->tag->setTitle('详情');
        $request = $this->request;
        $domain = Domain::findFirst(array("id = :id:", "bind" => array("id" => 3)));
        if ($domain == false) {
            return $this->showError("未找到推流对象", array(
                "返回域名管理" => "/domainaliyun",
                "返回首页" => "/"
            ));
        }
        $this->view->setVar("domain", $domain);
        if ($request->isPost()) {
            $original_url = $request->getPost('original_url');
            $deviceId = '1028';
            $currentTime = $request->getPost('startTime');
            $userId = $request->getPost('user_id');
            $expireTime = $request->getPost('expire');

            $streamId = $deviceId.$userId;
            $tokenTime = $this->getTokenTime($currentTime,$expireTime*60);
            $tokenSecret = $this->getTokenSecret($tokenTime,$streamId,$tokenTime);
       // 拼接url
$tokenUrl = $deviceId.'_test'.$userId."?tokenSecret=$tokenSecret&tokenTime=$tokenTime&userId=$userId"; $redis = RedisInstance::getInstance(); $redis->hMset('SIGNTOKEN:'.$userId, [ 'user_id' => $userId, 'sign' => $tokenSecret, 'expire' => $expireTime*60, 'original_url' => $original_url, 'status' => 'enable' ]); //这里保存过期时间,为了给客户短信通知,这个可以根据User_id去存储哦 $redis->setex($userId,$expireTime*60,$tokenTime); $this->view->setVar("token_url", $tokenUrl); $this->view->setVar("tokenSecret", $tokenSecret); return TRUE; } }

注意:Redis的键过期的时间设置应该是在用户已近开始打流的时候,也就是你用户的权限全部验证通过时候,设置改用户的userId为一个主键的过期时间,该时间也就是键过期的键值哦;注意在这里添加一句代码即可

/**
         * 验证签名是否合适
         */
        $sign = $redis->hGet('SIGNTOKEN:' . $userId, 'sign');
        $expire = $redis->hGet('SIGNTOKEN:' . $userId, 'expire');
        if ($tokenSecret != $sign) {
            echo "the sign errors";
            header('HTTP/1.0 404 Not Found');
            exit(1);
        } else {
            //这里保存过期时间,为了给客户短信通知,这个可以根据User_id去存储哦
            $redis->setex($userId,$expire,$tokenTime); //这里表示用户已近开始打流了,这时候计算打流时间就可以了
            echo "Username and Password OK";
        }
        return true;

 

目录
相关文章
|
编解码 内存技术
四款好用的免费直播编码推流软件
现代生活已经离不开互联网,离不开软件了。 这说法毫不夸张。 比如手机上各种APP眼花缭乱 ,各种行业, 各种功能, 各种Logo, 各种的各种。 没有良好的整理力,是真 的不好意思让别人看到啊。 这些功能各异的APP程序大多数是免费APP。
5681 0
|
开发工具 流计算
一点就通,解析直播源码拉流技术
之前我们分析了直播源码的推流技术,今天来简单分析下直播拉流技术怎么实现的。
|
视频直播
视频直播源码技术知识分享:连麦功能(一)
我们开发视频直播平台就要去了解视频直播开发相关功能知识,这对我们开发平台有着重要的作用,连麦技术就是视频直播源码重要的技术功能之一,每一个功能技术都有自己的用武之地
视频直播源码技术知识分享:连麦功能(一)
|
监控 安全 黑灰产治理
直播软件源码,审核的“中坚力量”鉴黄功能!
在利用直播软件源码去开发平台中,直播软件源码功能技术是开发直播平台的重要技术之一,今天我就为大家分享直播软件源码技术技术中的鉴黄功能的实现。
直播软件源码,审核的“中坚力量”鉴黄功能!
|
数据采集 编解码 搜索推荐
短视频直播系统,如何实现高质量直播场景
短视频直播系统,如何实现高质量直播场景
|
编解码 移动开发 小程序
视频直播技术干货:一文读懂主流视频直播系统的推拉流架构、传输协议等
本文将通过介绍实时视频直播技术体系,包括常用的推拉流架构、传输协议等,让你对现今主流的视频直播技术有一个基本的认知。
455 1
视频直播技术干货:一文读懂主流视频直播系统的推拉流架构、传输协议等
|
安全 数据安全/隐私保护
不同场景教育点播视频课程加密方案介绍
场景1:针对加盟幼儿园的课程,如何安全的发给各个加盟学校,让他们通过一体机给学生或者老师使用?如果能通过手机控制和操作点播课表内容就更好了; 场景2:做中小学的兴趣培训,比如美术或者书法,全国有数百家加盟店,想让加盟店能按照统一的教学标准进行教学,在加盟校观看方便的情况下,将视频放在特定的平板中,尽可能保证视频的安全,如何实现呢?方便点播视频、界面美观又能对视频加密,做到安全保护;
186 0
不同场景教育点播视频课程加密方案介绍
|
存储 编解码 人工智能
产品百科 |直播转点播最佳实践
直播转点播(直转点)是将直播流同步录制为点播视频,并支持媒资管理、媒体处理(转码及内容审核 / 智能首图等 AI 处理)、内容制作(云剪辑)、CDN 分发加速等一系列操作,可配置工作流自动处理,也可通过 API/SDK 灵活触发。
产品百科 |直播转点播最佳实践
|
视频直播
直播系统的顶梁柱:视频直播源码中的礼物功能
我们了解的直播系统功能是十分的实用且丰富的,一般来说,视频直播源码自带的功能有:直播功能、私信功能、邀请奖励、财务管理功能、短视频功能、直播PK功能、多种礼物功能、分享功能、拉黑功能、带货商城功能、家族功能、标签功能、评论功能等等实质性的功能,今天就针对礼物功能来做一下详细的介绍。
直播系统的顶梁柱:视频直播源码中的礼物功能
|
Web App开发 编解码 负载均衡
一对一语音直播系统源码如何解决音视频直播技术难点
直播作为实时性和互动性要求较高的音视频应用场景,存在非常多的技术难点,就连一对一的直播模式也毫不例外。比如低延迟、流畅性、回声消除、国内外互通和海量并发等问题,都是开发过程中的难点。但是,在开发过程中如果具备了优质的一对一语音直播系统源码,那么这些难点可能都会得到一定的解决。
一对一语音直播系统源码如何解决音视频直播技术难点