乐趣区

关于腾讯云:COS-音视频实践|给你的视频加把锁

导语

为了保障视频内容平安,避免视频被非法下载和流传,对象存储(Cloud Object Storage,COS)数据处理基于数据万象 CI 提供了 HLS 视频加密的性能,领有相比于公有读文件更高的安全级别。加密后的视频,无奈分发给无拜访权限的用户观看。即便视频被下载到本地,视频自身也是被加密的,无奈失常播放和二次散发,从而保障您的视频版权不受到非法进犯。

本文基于 COS 数据工作流,对视频进行 HLS 转码加密,同时搭建一套根底的密钥治理服务,并利用腾讯云超级播放器,播放加密后的视频文件。

一. 计划比照

说到视频加密,可能会有同学有这样的疑难图片:咦,存在 COS 上的文件不是能够设置成公有读么,再联合防盗链性能,这不是曾经很平安了,那我为什么还要多此一举,来对视频进行加密呢?
这位同学的这个问题问得十分好,没错,公有读写权限、防盗链性能、以及本期的配角视频加密性能,它们三者的关系十分奥妙,既有相似之处,又截然不同。接下来且听我细细分析,从概念和具体的应用场景比照三者之间的不同之处。

1.1 公有读写权限

公有读写权限是存储桶的三大公共权限(公有读写、私有读公有写和私有读写)之一,只有该存储桶的创建者及有受权的账号才对该存储桶中的对象有读写权限,其余任何人对该存储桶中的对象都没有读写权限。存储桶拜访权限默认为公有读写,也是举荐应用的拜访权限。
相比私有读文件,公有读文件不可匿名拜访,拜访时必须携带签名,实用于较私密,只提供给指定账号拜访的场景,安全性也绝对较高。

1.2 防盗链性能

腾讯云对象存储反对防盗链配置,用户能够对存储桶设置防盗链性能,该性能能够实现对拜访起源设置黑、白名单,防止资源被盗用。
其原理是通过申请 Header 里的 Referer 地址来进行判断,当浏览器向 Web 服务器发送申请的时候,个别会带上 Referer,通知服务器该申请是从哪个页面链接过去的,服务器就能够禁止或容许某些起源的网站拜访资源。实现对访客的身份辨认和过滤,避免网站资源被非法盗用,给用户带来不必要的损失。

1.3 视频加密性能

对于公开的视频文件,咱们无奈通过设置公有读写权限或防盗链性能来确保文件的所有权不受进犯,因为用户能够间接将其下载到本地,进而进行二次利用与流传。换言之,公有读写权限以及防盗链性能,保障的是文件拜访链路的安全性,但没有对文件内容自身做解决,一旦文件被下载到本地,便能够肆意妄为。
那么该如何保障源文件内容自身的安全性?接下来就隆重有请本期 COS 音视频实际的配角——视频加密性能。
视频加密是对视频文件进行加密解决,能够确保即便您的视频被下载到本地,但因为视频自身是加密过的,是“上了锁”的,所以是平安的,其他人无奈进行二次利用。

二. 实现原理和步骤阐明

本文应用的加密形式是 COS HLS 转码加密,对转码生成的视频分片进行加密解决。HLS(全称是 HTTP Live Streaming)是一个由苹果公司提出的基于 HTTP 的流媒体网络传输协定,它是苹果公司 QuickTime X 和 iPhone 软件系统的一部分。它的工作原理是把整个流分成一个个小的基于 HTTP 的文件分片来下载,每次只下载一些。当媒体流正在播放时,客户端能够抉择从许多不同的备用源中以不同的速率下载同样的资源,容许流媒体会话适应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个蕴含元数据的 extended M3U m3u8playlist 文件,用于寻找可用的媒体流。

2.1 实现原理

1)流程图:

2)加密流程:

1、用户侧将视频文件上传到 COS,触发 COS 数据工作流。

2、COS 收到加密申请后,向 KMS 服务申请加密密钥。

3、COS 拿到加密密钥后,对视频文件进行 HLS 转码加密。
4、加密实现后,COS 通过 CDN 散发加密后的 HLS 视频文件。

3)解密流程:

1、获取加密生成的 m3u8 文件对象地址。

2、播放器解析 m3u8 文件,向密钥服务申请解密密钥。
3、密钥服务先依据用户逻辑自行判断用户身份合法性,再通过调用 KMS 服务的 API 查问密钥,返回给播放器。

4、播放器拿到解密密钥后,对 HLS 视频分片进行解密并播放。

阐明:

  • KMS 服务:本加密计划中,COS 接入了腾讯云 KMS 服务。腾讯云 KMS 服务是一款平安治理类服务,能够轻松创立和治理密钥,爱护密钥的保密性、完整性和可用性。
  • 密钥服务:业务侧需自行搭建的密钥服务,用户身份鉴权和解密密钥的获取。

2.2 整体步骤
基于上述原理,进行如下三个具体操作步骤,便能够实现对视频的加解密与播放。文末咱们提供了一个样例 demo,欢送体验。

  1. 控制台配置步骤;
  2. 搭建密钥服务;
  3. 播放 HLS 加密视频;

三. 具体步骤

3.1 COS 控制台配置步骤

COS 数据工作流,帮忙您疾速、灵便、按需搭建视频解决流程。每个工作流与输出存储桶的一个门路绑定,当视频文件上传至该门路时,该媒体工作流就会被主动触发,执行指定的解决操作,并将处理结果主动保留至输入存储桶的指定门路下。此外,若针对已存在于存储桶中的文件,您可创立工作进行媒体解决、语音辨认、文档解决等操作,疾速帮您实现单任务解决。

1、登录 对象存储控制台) 进入存储桶治理页面并找到视频存储桶;
2、在左侧导航栏中,抉择数据工作流 > 公共配置 > 模板,进入模板配置页面
3、抉择音视频转码,单击创立转码模板,配置如下信息:

4、单击确定,实现加密模板配置后,在左侧导航栏中,抉择数据工作流 > 工作流 > 创立工作流,进行工作流配置。

5、增加音视频转码工作节点,抉择刚刚创立的自定义模版,配置如下:

6、保留后在工作流列表中启用该条工作流;

7、上传视频文件,便能看到生成了对应的加密 HLS 视频文件。其中 ts 文件是加密过后的视频分片,m3u8 文件作为索引文件,文件内容蕴含 ts 分片地址以及密钥服务地址。

3.2 搭建密钥服务

密钥服务用于业务侧身份鉴权和解密密钥的获取,先依据用户逻辑自行判断用户身份合法性,身份验证通过后,再通过调用 KMS 服务的 API 查问密钥,返回给播放器。

1、进入 密钥相干接口,依据本人的开发语言生成对应的 KMS API 调用示例代码。

2、上面以 Node.js 为例,基于 KMS API 调用示例代码,搭建一个 HTTP Server 作为密钥服务,获取解密密钥。

const Koa = require('koa')
const cors = require('koa2-cors')
const app = new Koa()
const tencentcloud = require("tencentcloud-sdk-nodejs")
​
app.use(cors()) // 跨域配置
app.use(getKMSDecryptKey(ctx)) // 获取 KMS 解密密钥
​
// 监听 8080 端口
app.listen('8080', () => {console.log('127.0.0.1:8080');
})
​
// 获取 KMS 解密密钥中间件
async function getKMSDecryptKey(ctx)  {
  // 生成的 m3u8 文件中的 URI 申请会默认带上参数
  const {Ciphertext, KMSRegion} = ctx.query
​
  const KmsClient = tencentcloud.kms.v20190118.Client
  const clientConfig = {
    credential: {
      // 账号 API 密钥,可返回 https://console.cloud.tencent.com/cam/capi 获取
      secretId: "SecretId",
      secretKey: "SecretKey",
    },
​
    region: KMSRegion, // 所在园区,eg:"ap-guangzhou"
    profile: {
      httpProfile: {endpoint: "kms.tencentcloudapi.com",},
    },
  };
​
  // 创立 KMS 对象实例
  const client = new KmsClient(clientConfig);
  const params = {"CiphertextBlob": Ciphertext,};
​
    try {
    // 发动申请,获取解密密钥
    const res = await client.Decrypt(params)
​
    // 取出密钥,base64 解密后返回其二进制数据
    const plaintext = res.Plaintext
    const plainBuff = Buffer.from(plaintext, 'base64');
    ctx.body = plainBuff
  } catch (error) {console.log(error);
  }
}

3.3 播放 HLS 加密视频

利用腾讯云超级播放器,传入 HLS 加密生成的 m3u8 文件对象地址,播放器解析 m3u8 文件,向密钥服务地址 UriKey 获取密钥后,解密对应的视频分片,进而播放视频。

1、在页面中引入播放器款式文件与脚本文件;

<!-- 播放器款式文件 -->
<link href="https://web.sdk.qcloud.com/player/tcplayer/release/v4.2.2/tcplayer.min.css" rel="stylesheet"/>
<!-- 如果须要在 Chrome 和 Firefox 等古代浏览器中通过 H5 播放 HLS 格局的视频,须要在 tcplayer.v4.2.2.min.js 之前引入 hls.min.0.13.2m.js。-->
<script src="https://web.sdk.qcloud.com/player/tcplayer/release/v4.2.2/libs/hls.min.0.13.2m.js"></script>
<!-- 播放器脚本文件 -->
<script src="https://web.sdk.qcloud.com/player/tcplayer/release/v4.2.2/tcplayer.v4.2.2.min.js"></script>

倡议在正式应用播放器 SDK 时,自行部署以上相干动态资源,单击下载播放器资源。

部署解压后的文件夹,不能调整文件夹外面的目录,防止资源相互援用异样。

2、设置播放器容器节点;
在须要展现播放器的页面地位退出播放器容器。例如,在 index.html 中退出如下代码(容器 ID 以及宽高都能够自定义)。

<video id="player-container-id" width="414" height="270" preload="auto" playsinline webkit-playsinline>
</video>

3、初始化播放器并设置 URL;
1)获取后面控制台配置步骤中加密生成的 m3u8 文件对象地址;

2)初始化播放器,并传入 m3u8 对象地址。

var player = TCPlayer('player-container-id', {}); // player-container-id 为播放器容器 ID,必须与 html 中统一
player.src(https://examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/path/example.m3u8); // m3u8 对象地址

3.4 成果
1、胜利获取到 m3u8 文件和解密密钥;

2、胜利解密并播放视频;

3、若间接下载 ts 视频分片到本地,因为视频自身是加密过的,因而无奈播放,保障视频的安全性。

四. 体验

以上实际,咱们筹备了一个线上体验 demo,欢送大家体验~

1、挪动端:扫码即可进行体验;

2、web 端:点击链接即可进行体验;

瞻望

本期「COS 音视频实际」到此结束,欢送大家体验应用,下期精彩内容,敬请期待。

退出移动版