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 音視頻實踐」到此結束,歡迎大家體驗使用,下期精彩內容,敬請期待。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM