內容保護的每一個機制都只解決一個特定問題,而它們解決的問題彼此不重疊。DRM 不防盜連,token 不防錄屏,浮水印不阻止任何事——它只讓你事後知道是誰。把這些機制當成可互相替代的「安全等級」是最常見的設計錯誤,結果是花了 DRM 的錢卻擋不住最常見的攻擊。

這一篇先把機制與它對應的威脅一一配對,再逐項標出能力邊界。下一篇用一份真實方案把它們組起來。


📖 學

一、先分清楚兩類威脅

盜刷(unauthorized pull/leeching)——沒有付費或沒有權限的人,直接拉你的流。特徵是流量放大:一個洩漏的播放網址可能被幾萬人同時拉,你的頻寬帳單先爆。

盜播(restreaming/再分發)——合法使用者拉一條流,然後重新編碼轉播給別人。特徵是流量正常:來源端看起來就是一個正常觀眾,一路流、合理碼率,用並發規則完全看不出來。

這兩類需要完全不同的防線,這是整個內容保護領域最重要的一條分界。

盜刷盜播
攻擊特徵流量異常放大流量完全正常
主要防線訪問控制(鑑權、並發、撤銷)內容追源(forensic 浮水印)
偵測方式伺服器端可直接觀測必須從外部發現盜播站點再回推
能否預防可以大幅壓制不能預防,只能追源與縮短存活時間

二、訪問控制層:防盜刷

盜連(hotlinking)防護——Referer/User-Agent 檢查。這幾乎沒有安全價值,兩者都是客戶端可任意偽造的標頭。它只能擋住最低階的嵌入,不能當成訪問控制。

Signed URL / Signed Cookie——把路徑、有效期、可選的 IP 或其他條件,用 HMAC-SHA256 或 RSA/ECDSA 簽名,CDN 邊緣驗簽後才放行。各大 CDN(CloudFront、Akamai、Cloudflare)都支援。

  • Signed URL 的問題是 HLS 有很多檔案:一個清單、數百個分片、多個階梯、音軌、字幕。每個都要簽會讓清單變得巨大且難以快取。
  • Signed Cookie 解決這個:一次下發 Cookie,覆蓋整個路徑前綴下的所有檔案。AWS CloudFront 的文件明確把這當成多檔案授權的建議作法。
  • Cookie 的代價是跨站限制:iframe 嵌入、Safari 的第三方 Cookie 政策會讓它失效。優先用同站播放網域,跨站部署必須另外驗證。

Token 鑑權(JWT)——比 signed URL 表達力更強:可以帶入使用者 ID、權限範圍、裝置綁定等宣告。

JWT 的實作陷阱很具體,RFC 8725(JWT Best Current Practices)把它們列成清單,其中最該注意的幾條:

  • 固定演算法白名單,不要信任 token 自己宣告的 alg(none 攻擊與 HMAC/RSA 混淆攻擊都源於此)。
  • 嚴格驗證 iss、aud、exp、nbf。
  • 限制 kid 的取用來源,不能讓 token 指定任意 URL 去抓公鑰。
  • 不同用途的 token 不可互相兌換(登入 token 不該能當播放 token 用)。

短 TTL 是對抗重放的主要手段,但它有一個關鍵限制:TTL 到期不等於斷流。見下面第五節。

地理封鎖(geo-blocking)——用 IP 歸屬地判斷。它是合約與法規的要求(授權區域),不是安全機制。VPN 與代理可以繞過;商業 VPN 偵測服務宣稱能抓到大部分已知 VPN 範圍,但誤判會直接傷害合法使用者(企業 VPN、CGNAT、跨境旅行),而誤判率沒有中立資料。實務立場:地理封鎖要做,但不要把它當成防盜的主力,也不要用單一訊號直接封鎖。

三、加密層:防「中途被撈走」

機制保護什麼不保護什麼
HTTPS/TLS傳輸過程被竊聽合法接收者之後的任何行為
DTLS-SRTP(WebRTC)RTP 媒體傳輸機密性不證明觀看權限——它是傳輸層
AES-128(HLS)整個分片加密金鑰取得後的一切
SAMPLE-AES / cbcs逐樣本加密同上,但相容 FairPlay

最重要的一句話:加密只解決「傳輸中被撈走」,不解決「拿到之後做什麼」。

HLS 的 AES-128 有一個常被忽略的弱點:金鑰是透過清單裡的 URI 取得的,如果那個 URI 沒有獨立鑑權,整個加密就是裝飾。任何能拿到清單的人也能拿到金鑰。這是「上了加密還是被盜連」的典型成因。

WebRTC 的 DTLS-SRTP 與 HLS 的內容加密是兩套完全不同的機制,不能互換也不能類比。 前者保護傳輸、每條連線協商一次;後者保護內容、金鑰可以跨連線重用。RFC 8827 對 WebRTC 的安全模型有明確定義,其中也區分了 RTP 媒體與 Data Channel 兩條路徑的保護方式。

四、DRM:加密 + 授權 + 強制執行

DRM 比單純加密多了三件事:金鑰由授權伺服器控制發放、解密發生在受保護環境(理想上是硬體 TEE)、可以附加使用規則(輸出保護、同時播放數、到期時間)。

三大系統:

DRM平台加密模式
WidevineAndroid、Chrome、多數智慧電視cenc、cbcs
PlayReadyWindows、Xbox、部分電視cenc、cbcs
FairPlayApple 全平台(iOS/macOS/tvOS/Safari)僅 cbcs

FairPlay 只支援 cbcs 這一點,決定了整個打包策略。 因為 Widevine 與 PlayReady 後來也都支援 cbcs,所以 CMAF + cbcs 成為「打包一次、三家通吃」的作法——這是 2026 年的生產預設,也是為什麼 打包 那篇強調 CMAF 對成本的影響。在此之前必須為 FairPlay 單獨打一份。

Widevine 的安全等級分三級(L1 硬體 / L2 / L3 軟體)。L3 在軟體中解密,可以被繞過;只有 L1 才有硬體層保護。「我們上了 Widevine」這句話沒有資訊量,必須問強制要求哪一級,以及不滿足時是降級還是拒播。

DRM 的能力邊界必須說清楚:

  • 它提高媒體提取與部分螢幕截圖的難度(搭配輸出保護可以擋住部分錄製路徑)。
  • 它不能阻止外部攝影機對著螢幕拍。
  • 它不能在撤銷後立刻清除已經發出的授權、金鑰與已緩衝的資料——這些各有自己的生命週期。
  • 它完全不防盜連:盜連發生在拿到授權之前,那是訪問控制的職責。

五、一個關鍵的機制斷層:TTL 不等於斷流

這是整個領域最容易出錯的地方,值得單獨講。

短 TTL 的 token 只能阻止「新的請求」,不能中止「已經建立的連線」。

  • HLS:因為是逐分片請求,token 過期後下一個分片請求會被拒 → 效果接近「到期即停」,延遲約等於一個分片長度。
  • WebRTC:連線一旦建立,媒體就在 RTP 上持續流動,不會再去問授權伺服器。token 過期對它毫無影響,可以一直播下去。

所以在 WebRTC 架構下,必須由媒體節點執行伺服器端的「租約」:節點自己維護一個到期時間,到期沒有續租就主動停止發送並關閉連線。這不是可選的優化,是唯一能真正斷流的機制。使用者提供的方案文件把這一條列為首要技術缺口(「短 Token 不會自動斷開 WebRTC」),詳見 案例拆解。

同樣的道理適用於 CDN:CDN 的簽名授權不等於即時撤銷。簽名在有效期內就是有效的,CDN 沒有辦法知道你在後台把某個 session 停權了。要做到即時撤銷,必須額外設計撤銷狀態的傳播機制。

六、浮水印:唯一能處理盜播的機制

可見浮水印(visible / UI overlay)——在畫面上疊 logo 或使用者 ID。它的作用是威懾,而且在前端 DOM/Canvas 上做的版本可以被輕易移除或裁掉。不能當成追源依據。

Forensic watermarking(鑑識浮水印)——把一個不可見的識別碼嵌進媒體本身,事後可以從盜錄的影片中還原出來,進而知道洩漏來自哪個 session。

主流作法是 A/B 變體(server-side A/B watermarking):

每個分片準備兩個版本:A 與 B(人眼無法分辨)
為每個 session 產生一個獨特的 A/B 序列,例如 A-B-B-A-B-A-A-B...
這個序列本身就是識別碼
從盜錄影片中讀出序列 → 對回 session

一個 32 位元的載荷可以涵蓋約 43 億個 session,而需要的識別時間 = 位元數 × 分片長度(再乘以容錯重複)。這直接推出兩個結論:

  • 分片越短,識別越快(這是低延遲架構的意外好處)。
  • 絕對不可能「幾秒就抓到」,除非載荷極短或分片極短。供應商宣稱的識別時間必須問清楚前提。

A/B 變體的結構性限制是:它依賴「分片」這個單位。 HLS/DASH 有分片,WebRTC 沒有。所以 OTT 的浮水印方案不能直接搬到 WebRTC——WebRTC 需要在媒體鏈路上做專門整合(逐會話編碼或供應商特製方案),而那把成本模型從「每條流一次」變成「每個觀眾一次」。這是低延遲與強保護之間最大的一塊缺口,也是 hub 待解問題裡的第一條。

攻擊面:裁切、縮放、重編碼、降幀率、疊圖層、多來源合謀(拿多份不同浮水印的拷貝混合以抹除標記)。供應商必須證明在這些攻擊下的檢出率與錯歸因率——錯歸因比漏檢更危險,因為它會導致封錯人。

七、機制與威脅的對應表

威脅有效機制無效機制
複製播放網址給別人短 TTL token、signed cookie、並發限制DRM、浮水印
多人共用一個帳號全局並發租約、裝置綁定加密、DRM
繞過 CDN 直接打源站私有源站、邊緣到源站的身份驗證隱藏網址(不是安全機制)
從備用網域/低碼率流繞過所有入口統一鑑權只保護主入口
竊聽傳輸TLS、DTLS-SRTP、內容加密—
從播放器提取媒體檔DRM(提高難度)單純 AES-128(金鑰可取得)
合法帳號錄屏轉播forensic 浮水印 + 盜播發現DRM、加密、並發限制(全部無效)
外部攝影機翻拍沒有技術解法,只有浮水印追源全部

最後兩列是重點:它們是唯一需要浮水印的場景,也是唯一 DRM 幫不上忙的場景。

八、誠實的能力邊界

沒有任何技術能阻止合法觀看者錄製內容。 螢幕擷取可以被 DRM 的輸出保護擋掉一部分,但外部攝影機永遠拍得到。所有防盜播的工程目標都應該是可量化的控制效果——縮短盜播存活時間、提高盜播成本、讓洩漏可追溯——而不是阻止捕獲。

撤銷不能收回已經送出去的內容。 已下載的分片、已緩衝的幀、已錄下的畫面,撤銷之後依然存在。驗收時必須分開量「伺服器何時停止發送」與「客戶端畫面何時停住」,這是兩個不同的數字。

任何宣稱「100% 防盜」「幾秒必然識別」的產品說明都應該要求對方提供測試方法與樣本。 分級見 主張 vs 可佐證。


🧠 記

盜刷與盜播是兩類威脅,需要兩條防線:訪問控制 vs 內容追源,不能互相替代。

Referer 檢查沒有安全價值;signed cookie 比 signed URL 更適合 HLS 的多檔案結構。

加密只解決傳輸中被撈走;AES-128 的金鑰端點若無獨立鑑權,整個加密是裝飾。

TTL 到期不等於斷流——WebRTC 必須由媒體節點執行伺服器端租約。

CDN 簽名授權不等於即時撤銷,要另外設計撤銷傳播。

FairPlay 只支援 cbcs,所以 CMAF + cbcs 是打包一次通吃三家的關鍵。

浮水印是唯一能處理盜播的機制,但它依賴分片,WebRTC 沒有現成方案。

沒有技術能阻止外部翻拍;目標是縮短存活時間與可追溯,不是阻止捕獲。


✍️ 實踐

對自己的服務做一次「入口盤點」,這是最常見漏洞的來源,約 30 分鐘:

  1. 列出所有可以取得媒體的 URL:master 清單、各階 media 清單、初始化分片、媒體分片、音軌、字幕軌、低碼率階、備用網域、測試環境。
  2. 對每一個,用一個沒有有效憑證的 curl 去打:
# 應該全部回 401/403,任何一個回 200 就是洞
curl -s -o /dev/null -w "%{http_code} %{url_effective}\n" "<每個 URL>"
  1. 特別測三個最常漏的:AES 金鑰端點、備用網域、直接打源站(繞過 CDN)。
  2. 再測一次「快取命中」的情況:同一個 URL 先用合法憑證請求一次(讓它進 CDN 快取),再用無效憑證請求——如果第二次回 200,代表鑑權發生在快取之後,等於沒有鑑權。

第 4 步是最容易出事也最難發現的一項,因為用單次測試完全看不出來。


🔗 延伸學習


相關