資料來源

本篇依據使用者提供的方案文件:《真人视频流防盗刷与防盗播技术方案——架构图解版 V2.0》(文件標示日期 2026-10-02,20 頁;前 8 頁為架構圖解,後 12 頁為「技術實施方案 V1.0」規範附錄)。 文件自述為獨立設計,明確聲明「不代表 Evolution 或 Pragmatic Play 的內部實現」,且其中所有 TTL、租約、並發、SLO 與容量數值均為待壓測驗證的參考設計,非承諾值。 以下引用其內容時標示為「方案」;我對它的評註與對照另行標明。

這份方案處理的是內容保護裡最嚴苛的一組約束同時成立的場景:真人荷官直播——次秒級延遲、連動真實金流、跨區域部署、透過第三方運營商接入。正因為約束嚴苛,它把一般 OTT 教材含糊帶過的地方逼出了明確答案,特別是**「短 token 為什麼擋不住 WebRTC」與「並發規則為什麼看不出盜播」**這兩個斷層。


📖 學

一、方案的核心框架:兩條並行防線

方案開宗明義把問題拆成兩條互不替代的防線,這與 內容保護基礎 的分法一致:

訪問控制限制盜刷與共享;內容追源處理單帳號低流量盜播。DRM 和指紋都不能替代權限控制。

它進一步拆成六層,每層標明執行位置與責任服務:

層名稱執行位置回答什麼問題
L1身份與權限Operator / Game Session誰有權進入哪張桌台?
L2播放授權Playback Auth / KMS憑證限定時間、桌台、協議、受眾
L3連接與資源額度Lease Authority / Media Edge跨區域、跨協議共享一份並發額度
L4實時阻斷Risk / Revocation / Edge撤銷後拒絕刷新、拒絕請求、停止媒體
L5媒體保護SRTP / HLS 加密 / DRM減少傳輸竊聽與直接媒體提取
L6洩漏追源水印 / 盜播發現 / 審計識別合法播放後的重新編碼轉播

方案自己下的核心原則很精準:「邊緣決定是否允許繼續發流;水印與發現系統負責定位合法帳號二次轉播的來源。」

二、方案指出的四個技術缺口(最值得抄的部分)

這是整份文件最有價值的一節——它列出四個「業界常見但其實錯誤」的判斷並逐一修正。我認為這四條可以直接當成任何低延遲保護方案的檢查表:

缺口 1:短 Token 不會自動斷開 WebRTC

媒體節點執行服務端租約,撤銷後主動關閉連接,租約失效後停止發送媒體。

這正是 基礎篇 第五節講的機制斷層。方案的解法是把授權拆成四個獨立物件,各有不同生命週期:

物件方案建議參數必須滿足
Launch Token30–60 秒,一次兌換服務端記錄消費狀態,抗競態與重放
Playback TokenTTL 60 秒,約 30 秒刷新並加抖動不依靠 TTL 實現即時斷流
連接租約(lease)15 秒,約 5 秒續租由媒體節點與租約服務續租,撤銷後不可續
重連重疊窗口最多約 10 秒限次數與總額度,不能累積舊連接
時鐘容差約 5 秒全鏈路同步並監控偏差

「加抖動」那一條容易被忽略但很關鍵:十萬個 session 若都在整點刷新,會製造週期性的尖峰。

缺口 2:CDN 簽名授權不等於實時撤銷

引入 session_epoch 與撤銷事件;每個邊緣維護有界新鮮度狀態。

session_epoch 是一個單調遞增的版本號。撤銷時遞增它,邊緣比對 epoch 就知道手上的憑證過期了——這讓撤銷不必逐一找出所有已簽發的 token,只要讓整個 session 的 epoch 失效即可。方案特別強調:「仅封当前 jti 不足以阻止同 Session 的其他 Token」,撤銷範圍要能從 lease 升級到 Session、帳號、乃至整個運營商。

缺口 3:設備標識不能證明設備持有

支持的控制 API 使用 DPoP;不把瀏覽器指紋當作強身份。

DPoP(RFC 9449)讓客戶端生成金鑰對、用私鑰簽署每個請求,於是偷到 token 的人沒有私鑰就用不了。方案同時誠實標出它的限制:原生 HLS 播放器未必能送自訂標頭,所以 DPoP 只能用於控制 API(授權、刷新、信令),不能用於媒體請求;而且它不能消除 XSS、合法端代簽或解碼後轉播。

缺口 4:水印不是加一個前端圖層

在受保護的媒體鏈路中嵌入;按協議、延遲和轉碼攻擊實測。

三、雙線路、同一控制面

方案的架構是 WebRTC 主線路 + LL-HLS 備用線路,而安全上最關鍵的一條設計原則是:

任何備用域名、低碼率、音軌或回退線路,都不能成為鑑權旁路。

具體落實為:

  • 統一播放控制面:會話、桌台、租約、epoch、撤銷共用一套。
  • WebRTC 側:HTTPS 信令鑑權 → 連接綁定租約 → DTLS-SRTP 媒體 → 節點持續檢查許可 → 撤銷時主動停止發送並關閉連接。
  • LL-HLS 側:播放清單 + 全部媒體資源 + 金鑰/許可證端點都要鑑權 → 每次請求先鑑權再允許快取命中 → 撤銷時拒絕後續資源請求。
  • 統一額度:切協議或跨區域遷移不能獲得額外無限並發。

「每次請求先鑑權,再允許緩存命中」這一條,正是 基礎篇 實踐段落裡第 4 步要測的東西——鑑權若發生在快取之後,等於沒有鑑權。

方案另有一條我認為特別值得注意的誠實陳述:「客户端已缓冲画面不可收回,需单独测可见停播时间。」

四、撤銷閉環:從「下令」到「真的停了」

方案把撤銷設計成一個有執行確認與故障上限的閉環,共六步:

① 檢測異常/確認洩漏(多信號風險或水印證據)
      ↓
② 權威撤銷狀態(epoch 遞增/lease 撤銷,停止刷新與續租)
      ↓
③ 可靠發布撤銷(帶序號、冪等、重試、補拉)
      ↓
④ 區域邊緣加載狀態(本地校驗 epoch/lease,過舊狀態不繼續放行)
      ↓
⑤ 媒體執行阻斷(WebRTC:停媒體+關連接;LL-HLS:拒絕後續請求)
      ↓
⑥ 審計與持續複查(收集各區域 ACK,失敗重試/節點落後告警)

建議驗收目標(方案明確標示須實測):

情境目標
正常鏈路:確認撤銷 → 服務端停止媒體/拒絕新請求P95 ≤ 3 秒;P99 ≤ 5 秒
控制面故障:停止新許可,現有租約到期即停流故障上限 ≤ 20 秒(含容差與執行延遲)

故障時的有界策略是這一節最成熟的地方——它不假設系統永遠健康:

故障建議行為
鑑權/租約服務不可達拒絕新建許可;現有連接最多運行至已批准的租約到期
撤銷總線中斷節點拉取補償;超過新鮮度上限就拒絕請求
區域切換或網路分區無權威許可不增加並發;舊區域額度只能到期或由已確認的遷移釋放
水印檢測服務不可用保留映射與樣本,告警並恢復;不因此放開視頻鑑權

「fail closed 而非 fail open」貫穿整張表,而且每一條都給了有界的降級行為而不是「掛了就不管」。

五、全局並發:為什麼不能用各區 Redis 相加

方案對並發控制的要求很具體:

以帳戶和業務權限為分區鍵,在權威服務執行原子獲取/續租/釋放,不靠各區域 Redis 計數事後相加。跨區切換通過 fencing epoch 使舊所有者失效。異步消息隊列用於遙測和審計,不承擔同步准入的唯一依據。

這是分散式系統的標準正確作法:計數相加在分區發生時會重複計算,給出比實際更寬鬆的額度,而攻擊者正好可以利用網路分區來放大並發。fencing epoch 是讓舊的所有者在恢復後無法繼續操作的標準手段,與 Design Pattern 高級詳解 裡討論的機制同源。

六、浮水印與盜播發現:方案對 WebRTC 缺口的誠實處理

方案對浮水印的要求與 基礎篇 一致:必須進入媒體而非只在 UI;水印 ID 用隨機不透明識別碼再由服務端映射到 lease/Session/Operator/table/round,不直接嵌入玩家真實姓名或帳號(這同時是隱私設計)。

兩條線路的作法明確分開:

線路候選實現必須驗證
LL-HLS編碼/打包生成 A/B 變體,按會話序列選路選路不可由客戶端控制;保護全部變體;驗證快取與 ABR 切換
WebRTC媒體鏈路的水印編碼、變體切換或供應商專門整合關鍵幀、RTP 時間戳、解碼連續性、延遲與每路成本
高價值桌台有限會話個體化編碼或原生客戶端整合併發成本與延遲

方案在這裡給出一個我認為是全文最誠實的一句話:

若 WebRTC 個體化水印尚未通過驗證,應明確當前只能反共享,二次轉播追源能力仍存在缺口。

它同時明確要求 PoC 必須用真實桌台視頻測試錄屏、720p/480p/360p 降解析度、不同碼率、兩輪轉碼、裁剪縮放、幀率變化及多源混合,並報告檢出率、錯歸因率、檢測 P95 時間、最小採樣時長與計算成本——而且「不能承諾幾秒必然識別」。

七、容量模型:安全設計的硬約束來自這裡

方案以 10 萬同時觀看為例給出一組數字,而這組數字直接決定了安全架構必須怎麼設計:

項目計算結果
媒體淨出流100,000 × 1.5 Mbps約 150 Gbps
每用戶每小時1.5 Mbps × 3600 ÷ 8約 0.675 GB
10 萬用戶小時0.675 GB × 100,000約 67.5 TB
播放授權刷新(30 秒一次)100,000 ÷ 30約 3,333 次/秒
租約續租(5 秒一次)100,000 ÷ 5約 20,000 次/秒
LL-HLS part 請求(part 0.5 秒)100,000 ÷ 0.5約 200,000 次/秒

最後一列推出方案裡最重要的一條工程約束:

因此不能每個媒體請求跨區域查詢中心 Redis,必須在邊緣本地驗簽並執行有界狀態檢查。

這就是為什麼撤銷必須用 epoch 這種「可本地判斷」的機制,而不是「每次都問中心」。 安全設計在這裡被容量直接倒逼出形狀——這是我認為這份方案最值得學的推理方式:不是先想要什麼安全性,而是先算出每秒要處理多少請求,再在那個約束下設計能成立的機制。

方案同時標注這組數字未計音訊、協議開銷、重傳、ABR、TURN、回源與冗餘,採購必須額外壓測留餘量。

八、實施順序與驗收

方案給出四階段,順序本身就是結論——先封住訪問旁路,再證明能斷流,同時盡早做水印 PoC:

階段交付物上線門檻
A 基礎防盜刷授權分離、全入口鑑權、私有源站、金鑰管理過期/越權/無授權請求全部失敗,快取命中無繞過
B 斷流與反共享權威租約、跨區額度、撤銷 ACK、規則影子運行分區和重啟不放大額度;斷流符合健康/故障上限
C 雙路線與加密WebRTC + LL-HLS 完整回退、DRM 按需整合iOS/Android/桌面及弱網通過,安全回退無旁路
D 二次轉播追源水印 PoC、映射、盜播發現、證據與撤銷閉環按攻擊樣本驗證準確率、檢測時長及成本

「規則影子運行」(shadow mode)那一條值得特別點出:風控規則先只記錄不執行,證明準確性之後才真的開始封鎖。這是避免「一條規則誤殺全站」的標準作法,方案也明確要求「先小區域/小桌台灰度,再擴大,禁止全站直接啟用未經驗證的封禁規則」。

九、方案裡的風控與隱私紀律

兩條我認為特別成熟的設計原則:

不以單一信號定罪。 方案列出 VPN、CGNAT、跨網切換都需要降低單信號權重;「長時間觀看」只作輔助線索,「无下注不能单独触发封禁」。這是對誤判成本的正確認識。

安全與資金分離。 「安全事件不得自動修改投注結果或帳務記錄;風控與資金結算權限分離。」這條在金流場景是硬要求,也是任何自動化封鎖系統都該有的邊界。

隱私面:以伺服器與邊緣日誌為主要事實(客戶端統計可能被偽造,與 QoE 篇 的量測紀律一致)、使用者 ID 做偽名化、不記錄完整 Token、私鑰和媒體金鑰、建議保留期熱狀態按租約 TTL/明細事件 7–30 天。

十、採購驗證:三個問題

方案給出三個拿去問供應商的問題,我認為這是全文最實用的一段:

  1. 能否強制關閉 WebRTC 連接?
  2. CDN 緩存命中前能否檢查撤銷狀態?
  3. 水印能否在實際協議和延遲預算下完成追源?

這三個問題各自對應前面講的一個機制斷層,而且都不是靠讀產品文件能回答的——必須實測。方案也提醒:CloudFront 的簽名授權文件只證明它的 HTTP 私有內容控制能力,不能據此認定它直接提供 WebRTC、租約或撤銷功能。


🧠 記

六層框架的分工:L1 身份 → L2 授權 → L3 額度 → L4 阻斷 → L5 加密 → L6 追源;前四層打盜刷,L6 打盜播。

四個授權物件生命週期不同:Launch Token(30–60 秒一次性)、Playback Token(60 秒)、連接租約(15 秒/5 秒續)、重連窗口(10 秒)。

session_epoch 讓撤銷可在邊緣本地判斷,不必每次問中心——這是被 200,000 請求/秒的容量倒逼出來的。

並發額度必須原子執行,不能各區 Redis 相加;跨區用 fencing epoch。

撤銷驗收要分開量「服務端停止發送」與「客戶端畫面停住」,後者受緩衝影響。

WebRTC 的個體化浮水印仍是公開缺口;沒驗證過就該誠實說「目前只能反共享」。

三個採購問題:能否強制關 WebRTC 連接、快取命中前能否檢查撤銷、水印能否在實際延遲預算下追源。


✍️ 實踐

用方案的驗收用例,對自己的系統做一次對照檢查(即使你不做荷官直播,前三類都通用),約 60 分鐘:

授權類——重放 Launch Token、篡改 JWT、錯誤 aud/iss、未知 kid、換 table/protocol、請求未保護的音軌/低碼率/金鑰端點。預期:全部拒絕且不洩漏敏感資訊。

共享類——兩地同時消費同一租約、跨協議搶佔、切桌重連、雙區域同時獲取額度。預期:超過許可的新增連接必須拒絕,正常重連在約定窗口成功。

撤銷類——覆蓋活躍 WebRTC、已快取命中的 LL-HLS、舊 Token、刷新、節點重啟、撤銷事件亂序、消息總線中斷、控制面網路分區。分別記錄服務端停止發媒體的時間與客戶端可見停播時間。

正常體驗類——行動網路切換、CGNAT、合法 VPN、多桌授權、Safari iframe、Cookie 被阻擋、時鐘偏差、弱網。預期:能區分「安全阻斷」與「普通播放失敗」,並統計誤阻率。

最後一類最常被跳過,而它正是衡量「安全做過頭」的唯一方法。


🔗 延伸學習

方案自身列出的技術依據(皆為一手標準或官方文件,資料核查日期 2026-10-02):


相關