最近工作上有碰到 AES 和 DRM
雖然是使用別人的服務
但還是想稍微了解一下運作的方式

AES 與 DRM 的差別

AES 是一種加密的方法,它可以算是廣義的 DRM
缺點是不能驗證播放端是誰,只要有 key 就可以解鎖
就像有些會員卡認卡不認人,大家可以都拿同一張卡取得優惠

但 DRM 不一樣
除了 key 還會檢查你發出的 request
就像你打電話給信用卡客服
客服會問你身分證和畢業於哪個國小一樣

DRM 如何運作

這張 流程圖 大概說明了 DRM 如何運作

  1. 將原始檔上傳到雲端
  2. 轉檔 (DASH, HLS)
  3. 加密 (Widevine, Fairplay, PlayReady)
  4. 儲存
  5. 客戶端點擊播放,DRM Server 驗證你的身分
  6. DRM Server 給客戶端解密鑰匙並順利播放影片

如果把 3~6 步驟講更詳細一點:

  1. OTT 跟 DRM 供應商申請 License 後,拿到鑰匙來加密檔案
  2. 客戶端點擊播放鈕
  3. OTT Server 驗證此客戶有沒有權利看 (有沒有登入會員或付費等)
  4. 驗證通過就給 token,接著去 CDN 拿檔案回來
  5. DRM Server 檢查客戶端發出的 DRM License Request
  6. 驗證通過就給客戶解密鑰匙,讓影片順利播放

瀏覽器的 DRM

若要瀏覽器能夠支援 DRM,就要支援 EME
透過 EME 觸發 CDM
就能把 Lincese Requst 送去 DRM Server 做驗證

因為不同瀏覽器支援不同的 DRM
所以為了確保任何一個平台都能觀看影片
需要使用多種的 DRM (Multi-DRM)

目前主流的 DRM 系統如下

  • Widevine (Google)
  • Fairplay (Apple)
  • PlayReady (Microsoft)

通常

  • macOS, iOS 和 Safari 使用 HLS 和 FairPlay
  • Firefox, Chrome 使用 DASH 和 Widevine
  • Windows, Edge 使用 DASH 和 PlayReady

所以先決定服務要支援什麼平台
再根據平台支援的 DRM 去決定影片格式

更詳細的支援列表可 看這裡

DRM 的費用

MAL (Monthly Active Licenses) 是 DRM 計費的方法之一
也就是一個月裡發的 linceses 數量

這篇 文章 介紹了 DRM 的計算方式

通常 MAL 是根據用戶數量和播放次數來計算
但有時候會有例外:

  • A 用戶在兩個設備上看同一支影片,要兩個 license
  • A 用戶在同個設備播放同支影片,但在不同時間播放,也要兩個 license (每個 license 僅有一段許可時間)
  • 影片的視訊和音訊檔案是分開的,也要兩個 license

MAL = 月活耀用戶 x (播放數量 + 下載數量)

假設我們有

  • 一萬個月活耀用戶
  • 一個用戶一個月看八個影片
  • 一個用戶一個月下載兩個影片
1
10,000 x (8 + 2) = 100,000 MALs

每個 license 的費用乘以 MAL 數量就可以算出月費
每一家的 license 費用可能不同
如果以 PallyCon Multi DRM Cloud 的定價來計算
它有個基本 20,000 MAL 的量是 $500
我們的 10,000 MAL 剛好沒有超過基本量
所以月費就是 $500

那如果是 100,000 MAL
扣除 20,000 MAL 基本費,還有 80,000 MAL 的量
定價表有個 80,000 MAL 的級距
每 100 個 licenses 要 $0.5
所以月費是

1
20,000 MAL 基本費 + (額外 80,000 MAL / 100 X $0.5) = $900

那如果是 1,000,000 MAL
扣除 20,000 MAL 基本費,還有 980,000 MAL
980,000 扣除 80,000 級距的量還有 900,000 MAL
900,000 扣除 400,000 級距的量還有 500,000 MAL
500,000 扣除 500,000 級距的量等於 0
所以根據每個級距的費用,月費是

1
20,000 MAL 基本費 + (80,000 MAL / 100 x $0.5) + (400,000 MAL / 100 x $0.35) + (500,000 MAL / 100 x $0.3) = 500 + 400 + 1,400 + 1,500 = $3800

如何驗證 DRM

DRM 沒有測試環境
且瀏覽器的網址必須是 https://,不能用 localhost
這是因為驗證時,瀏覽器需要跟 DRM Server 連線
所以我們測試跟觀眾使用服務一樣,都是要算錢的!

不過~
網路上有一個免費的 DRM Demo
就是 Shaka Player

沒加密 Demo

請點擊這個 影片
先打開 DevTools > Network
接著按播放

可以看到載入很多 video 和 audio 的檔案
任選一個 video 點右鍵 > Open in new tab
直接可以播,所以代表沒加密

有加密 Demo

請點擊這個 影片
一樣任選一個 video 點右鍵 > Open in new tab
雖然有時間軸,但畫面一片黑

因為這個新分頁沒有給 lincese request
所以檔案有下載下來,但內容無法播放
就像你拿到一個裝滿錢的保險箱卻打不開它

回來 Shaka Player 的 Network Console
有一個 no_auth 的 request
Headers 裡的 Request Payload 有一堆亂碼
這些會送去給 DRM Server 看

然後 DRM Server 的 Response 也回傳了一堆亂碼給瀏覽器

總結 DRM 的驗證過程

  1. 瀏覽器透過 EME 驅動 CDM 送出 request 給 DRM Server
  2. DRM Server response 解密的鑰匙
  3. CDM 解密影片

如果沒有以上這些動作
就播不出影片了~

AES 實例

現在很多 OTT 都有使用 AES 加密
試著找一個來看看
一樣先開啟 DevTools 的 Network
然後播放任一影片

任選一個 .ts > Open in new tab
然後 .ts 就被下載下來,但是我們卻播放不了

回到 DevTools 的 Network,搜尋 m3u8
有一個 chunklist_b400000.m3u8
在第五行顯示 #EXT-X-KEY:METHOD=AES-128
這個就代表它使用了 AES-128 加密~

如果想要自己製作 AES 加密
可以使用 openssl 和 ffmpeg 來完成
詳細內容請參考 這篇文章

要用 AES 還是 DRM

有錢用 DRM,沒錢用 AES

如果片商要求要有 DRM
那就一定要花錢了

至於其他的
就使用 AES 吧~

不過 AES 也沒很安全
因為在下載檔案時,同時能取得 key
只要在本地端解密就能播放了
所以就算 AES 會固定時間換 key
但他早就用舊的 key 解完了

不像 DRM 要透過瀏覽器的行為
與第三方伺服器連線來驗證

參考文件