使用腾讯云云点播对视频进行HLS加密

2019-12-30 18:27:22 浏览数 (1)

加密并不是百分百不会泄露,只是增加直接获取被加密资源的代价,别人录屏等等也是可以的,防不胜防

这里我们说一下使用腾讯云云点播对视频进行HLS加密,云点播提出了一套基础级别的 DRM(数字版权管理) 方案,使用 HLS 的普通 AES 加密技术对视频内容加密,保障内容安全

什么是HLS普通加密方案,这里就不说了,感兴趣的查看腾讯云文档,开发之前还是要好好读腾讯云文档,有很多暗坑

虽然文档有这么长,看了几遍,加上期间提交工单询问一些事情,总结一下五步就可以完成HLS加密

  1. 创建 HLS 普通加密模板
  2. 对需加密视频进行加密转码
  3. 前端利用 tcplayer(或者超级播放器)播放视频;
  4. 播放器自动请求 getkeyurl 获取 dk,getkeyurl 根据业务侧逻辑确认是否返回 dk;
  5. 成功返回 dk 播放器自动解码播放。

封装了一个composer包,直接使用就可以了

安装

代码语言:javascript复制
composer require sy-records/vod-hls

使用方法

  1. 创建 HLS 普通加密模板
代码语言:javascript复制
/**
 * 创建 HLS 普通加密模板
 * @url https://cloud.tencent.com/document/product/266/35167
 */
$config = [
    "Action" => "CreateSimpleAesTemplate", // 接口指令的名称
    "get_key_url" => "", // HLS 普通加密模板的 GetKeyURL 必须https
    "Region" => "", // 区域参数
    "Timestamp" => time(), // 当前 UNIX 时间戳
    "Nonce" => uniqid(), // 随机正整数,与 Timestamp 联合起来, 用于防止重放攻击
    "SecretId" => "", // 由腾讯云平台上申请的标识身份的 SecretId
];

$secretKey = ""; // 由腾讯云平台上申请的标识身份的SecretKey 需要生成签名

$data = Core::getCloudData($config, $secretKey);
  1. 通过 ProcessFile 接口发起视频加密
代码语言:javascript复制
/**
 * 通过 ProcessFile 接口发起视频加密
 * @url https://cloud.tencent.com/document/product/266/9642
 */
$config = [
	"Action" => "ProcessFile",
	"fileId" => "", // 文件 ID
	"transcode.definition.0" => 230, // 转码输出模板号
	"transcode.drm.definition" => 10, // 视频加密控制参数,加密方式;
	"Region" => "", // 区域参数
	"Timestamp" => time(), // 当前 UNIX 时间戳
	"Nonce" => uniqid(), // 随机正整数,与 Timestamp 联合起来, 用于防止重放攻击
	"SecretId" => "", // 由腾讯云平台上申请的标识身份的 SecretId
	"notifyMode" => "Finish" // 任务流状态变更通知模式任务流状态变更通知模式。
];

$secretKey = ""; // 由腾讯云平台上申请的标识身份的SecretKey 需要生成签名

$data = Core::getCloudData($config, $secretKey);
  1. 获取视频信息(获取EDK) 获取 EDK 时,drm 内容需要在视频转码完成后获取,需要依靠视频转码完成回调,或多次请求 GetVideoInfo,或提前加密延时获取EDK
代码语言:javascript复制
/**
 * 获取视频信息
 * @url https://cloud.tencent.com/document/product/266/8586
 */
$config = [
	"Action" => "GetVideoInfo",
	"fileId" => "", // 文件 ID
	"Region" => "", // 区域参数
	"Timestamp" => time(), // 当前 UNIX 时间戳
	"Nonce" => uniqid(), // 随机正整数,与 Timestamp 联合起来, 用于防止重放攻击
	"SecretId" => "", // 由腾讯云平台上申请的标识身份的 SecretId
	"notifyMode" => "Finish" // 任务流状态变更通知模式任务流状态变更通知模式。
];

$secretKey = ""; // 由腾讯云平台上申请的标识身份的SecretKey 需要生成签名

$data = Core::getCloudData($config, $secretKey);
  1. 根据业务侧逻辑确认是否返回 dk
代码语言:javascript复制
/**
 * getkeyurl获取dk
 * @url https://cloud.tencent.com/document/product/266/9643
 */
$config = [
	"Action" => "DescribeDrmDataKey",
	"edkList.0" => "", // 视频edk
	"Region" => "", // 区域参数
	"Timestamp" => time(), // 当前 UNIX 时间戳
	"Nonce" => uniqid(), // 随机正整数,与 Timestamp 联合起来, 用于防止重放攻击
	"SecretId" => "", // 由腾讯云平台上申请的标识身份的 SecretId
];

$secretKey = ""; // 由腾讯云平台上申请的标识身份的SecretKey 需要生成签名

$data = Core::getCloudData($config, $secretKey);

$res = json_decode($data,true);

// 需要进行decode还原为二进制
echo base64_decode($res['data']['keyList'][0]['dk']); 

EDK 和 DK 关系一一对应,可直接缓存,至此,业务方成功返回 dk,播放器自动解码播放 ?

Github项目地址:sy-records/vod-hls

沈唁志,一个PHPer的成长之路! 任何个人或团体,未经允许禁止转载本文:《使用腾讯云云点播对视频进行HLS加密》,谢谢合作!

0 人点赞