You need to enable JavaScript to run this app.
导航
视频安全
最近更新时间:2024.05.24 14:40:12首次发布时间:2022.10.28 17:25:20

火山引擎视频点播服务提供了完善的内容保护机制,为您的业务安全保驾护航。您可以根据自身业务场景,选择不同的安全措施。本文为您介绍视频安全的概述、URL 鉴权和视频加密的详细说明。

URL 鉴权

视频点播默认提供包含鉴权的的视频播放地址,您可根据自身业务安全需求,在点播控制台,分发加速设置 > 域名管理的域名配置中对 Referer 黑白名单、IP 黑白名单、链接有效期等进行配置。详细操作配置请参见域名配置

鉴权流程

图片
整体流程说明如下所示。

  1. 服务端下发带鉴权的视频播放地址。获取视频播放地址的方式有两种,如下所示。
    • 通过服务端 GetPlayInfo 方式获取。
    • 根据规则自行拼接。
  2. 客户端使用该鉴权 URL 向 CDN 节点发起资源请求。
  3. CDN 校验 URL 中的加密信息。校验的结果如下所示。
    • 通过:若鉴权通过,则返回媒体内容。
    • 失败:若鉴权失败,则返回 403。

视频地址加密规则

规则

示例

访问 URL 格式

scheme://host/path?auth_key=timestamp-rand-uid-md5hash(&...)

访问 URL 示例

https://www.volcengine.com/product/cdn?auth_key=1620291453-RGjpOiCONz-0-a8054e3070d32f4c2ba92cf1e8afc66c

md5hash密文串生成规则

md5hash = md5(path-timestamp-rand-uid-key)

详细的参数说明如下表所示。

参数

释义

描述

配置位置

备注/极限

path

路径

访问路径,通过访问 URL 获取

客户端

取值以 "/" 开头

timestamp

过期时间

过期 Unix 时间,十进制整数,从 UTC 1970 年 1 月 1日 0 时 0 分 0 秒起至现在的总秒数,不考虑闰秒

客户端

十进制整数

rand

随机数

随机字符串

客户端

可由 1-100 位大小写字母与数字组成

uid

用户 ID

固定写为 0

客户端

key

密钥

密钥作为待签算明文串的一部分进行 md5 计算

客户端/CDN

火山引擎 CDN URL 签算校验功能支持至多2组密钥同时生效,密钥为必填;可由 6-40 位大小写字母与数字组成

注意

火山引擎 CDN 会在签名校验通过后,将存在于查询字符串中的签名参数,即auth_key=timestamp-rand-uid-md5hash 部分删去。

视频加密

URL 鉴权无法解决用户拿到链接下载到本地后进行二次分发的场景。针对安全性要求更高的业务场景,建议对视频媒体内容进行加密处理。对视频数据加密,即使下载到本地,视频本身也是被加密的,无法恶意二次分发。视频加密可有效防止视频泄露和盗链问题。

使用流程

如下图所示是 Vid 播放方式完整流程。需要 AppServer 下发播放凭证。点播 SDK 处理了其中多个环节,您需要重点关注:加密转码解密播放
图片

加密转码

控制台

  1. 登录视频点播控制台,进入指定空间。

  2. 单击左侧导航栏媒资管理 > 视频管理,上传视频文件。

  3. 单击左侧导航栏媒体处理设置 > 媒体处理模板,选择视频转码模板页签,您可根据自身业务需求,配置视频转码模板参数,开启 DRM 加密按钮。详情请参见视频转码模板
    图片

  4. 单击左侧导航栏媒体处理设置 > 工作流模板,勾选视频转码模板设置不同配置,完成工作流模板创建。详情请参见工作流模板

  5. 媒资管理 > 视频管理页面,勾选视频文件,单击列表上方的处理视频按钮。

  6. 在工作流任务中,查看任务处理状态。详情请参见工作流任务

  7. 处理完成后,在视频管理页面,单击详情按钮,进行视频详情页面,查看视频地址。详情请参见视频详情

OpenAPI

移动端解密播放

移动端解密播放,需要 2 个步骤完成,即生成播放凭证后,使用客户端进行播放。

生成播放凭证-服务端 SDK

生成播放凭证即为playAuthToken,客户端获取视频播放地址时使用。您需要开发AppServer 用于下发播放凭证给客户端。
为方便您的使用,我们对播放临时安全凭证(PlayAuthToken)使用进行了封装,提供了多语言的 SDK。建议您使用服务端 SDK 来调用。

说明

针对加密视频,需设置 FileType = evideo

客户端播放

Android 端解密播放的代码示例如下所示。

final String vid = "your video id"; // appServer 下发
final String playAuthToken = "your video id's play auth token"; // appServer 下发
final int encodeType = TTVideoEngine.CODEC_TYPE_H264;
// final int encodeType = TTVideoEngine.CODEC_TYPE_H265;
// final int encodeType = TTVideoEngine.CODEC_TYPE_H266;
// 1.组装 vid 播放源
StrategySource vidSource = new VidPlayAuthTokenSource.Builder()
        .setVid(vid)
        .setPlayAuthToken(playAuthToken)
        // 设置 Codec 类型(h264,h265、h266),不传则使用默认值 h264
        .setEncodeType(encodeType)
        // 启播清晰度设置,这里演示设置为 480P。不传使用默认值 360P
        .setResolution(Resolution.High)
        .build();
// 2.设置播放源
ttVideoEngine.setStrategySource(vidSource);

iOS 端解密播放的代码示例如下所示。

// VideoID 方式播放,需要同时设置 playAuthToken  NSString *videoId = @"video id";
NSString *playAuthToken = @"play auth token";
[self.engine setVideoID:videoId];
[self.engine setPlayAuthToken:playAuthToken];

Web 端解密播放

媒体处理将视频内容按照 HLS AES-128 标准协议进行加密,加密后的视频支持 HLS 规定的播放器进行播放。安全级别低于私有加密,需要您根据自身实际业务需求,进行密钥保护,如登录 cookie、refer 限制等。
Web 端解密播放,需要 2 个步骤完成,即生成解密凭证后,使用 Web 端进行播放。

生成播放凭证-服务端 SDK

与移动端只需要设置playauthtoken不同,web 端需要同时设置 keyToken。为方便您的使用,我们对播放临时安全凭证(keyToken)使用进行了封装,提供了多语言的 SDK。建议您使用服务端 SDK 来调用。

Web 端

Web 端播放的代码示例如下所示

<!DOCTYPE html>
<html lang="zh">
<head>
    <title>视频云播放器</title>
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" />
    <meta name="referrer" content="no-referrer">
    <link rel="stylesheet" href="//unpkg.byted-static.com/volcengine/veplayer/1.0.1/dist/index.min.css">
    <script>window.gfdatav1="env":"prod","ver":"1.0.0.138","canary":0,"garrModules":null,"envName":"prod","region":"cn"</script><script src="//unpkg.byted-static.com/volcengine/veplayer/1.0.1/dist/index.min.js"></script>
</head>
<body>
<div id="mse"></div>
<script>
    const playerSdk = new VePlayer({
      id: 'mse',
      width: 800,
      height: 500,
      getVideoByToken: {
        playAuthToken: 'playAuthToken',
        keyToken: 'keyToken'
    }
  });
</script>
</body>

</html>