You need to enable JavaScript to run this app.
导航

视频安全

最近更新时间2023.10.20 15:02:24

首次发布时间2022.10.28 17:25:20

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

URL 鉴权

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

鉴权流程

alt

整体流程说明如下所示。

  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 处理了其中多个环节,您需要重点关注:加密转码解密播放

alt

加密转码

控制台

  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>