使用騰訊云云點播對影片進行HLS加密

  • 2019 年 12 月 30 日
  • 筆記

加密並不是百分百不會泄露,只是增加直接獲取被加密資源的代價,別人錄屏等等也是可以的,防不勝防

這裡我們說一下使用騰訊云云點播對影片進行HLS加密,雲點播提出了一套基礎級別的 DRM(數位版權管理) 方案,使用 HLS 的普通 AES 加密技術對影片內容加密,保障內容安全

什麼是HLS普通加密方案,這裡就不說了,感興趣的查看騰訊雲文檔,開發之前還是要好好讀騰訊雲文檔,有很多暗坑

雖然文檔有這麼長,看了幾遍,加上期間提交工單詢問一些事情,總結一下五步就可以完成HLS加密

  1. 創建 HLS 普通加密模板
  2. 對需加密影片進行加密轉碼
  3. 前端利用 tcplayer(或者超級播放器)播放影片;
  4. 播放器自動請求 getkeyurl 獲取 dk,getkeyurl 根據業務側邏輯確認是否返回 dk;
  5. 成功返回 dk 播放器自動解碼播放。

封裝了一個composer包,直接使用就可以了

安裝

composer require sy-records/vod-hls

使用方法

1. 創建 HLS 普通加密模板

/**   * 創建 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);

2. 通過 ProcessFile 介面發起影片加密

/**   * 通過 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);

3. 獲取影片資訊(獲取EDK) 獲取 EDK 時,drm 內容需要在影片轉碼完成後獲取,需要依靠影片轉碼完成回調,或多次請求 GetVideoInfo,或提前加密延時獲取EDK

/**   * 獲取影片資訊   * @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);

4. 根據業務側邏輯確認是否返回 dk

/**   * 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加密》,謝謝合作!