流媒體加密


本文只討論應用於瀏覽器環境的流媒體協議的加密

為什么要加密視頻

付費觀看視頻的模式是很多平台的核心業務,如果視頻被錄制並非法傳播,付費業務將受到嚴重威脅。因此對視頻服務進行加密的技術變得尤為重要。

本文所指的視頻加密是為了讓要保護的視頻不能輕易被下載,即使下載到了也是加密后的內容,其它人解開加密后的內容需要付出非常大的代價。

無法做到嚴格的讓要保護的視頻不被錄制,原因在於你需要在客戶端播放出視頻的原內容,解密的流程在客戶端的話不法分子就能模擬整個流程,最保守也能用屏幕錄制軟件錄制到視頻的原內容(可以通過加水印的方法緩解下)。我們的目標是讓他獲取原內容的代價更大。

常見視頻加密技術

視頻加密技術分為兩種:

  1. 防盜鏈:通過驗證的用戶才能訪問到沒有加密的視頻內容,這種方案存在視頻很容易就被下載的風險,嚴格來說這不屬於加密。這種方式其實是資源訪問授權,它實現起來簡單。
  2. 加密視頻本身:通過對稱加密算法加密視頻內容本身,用戶獲得加密后的視頻內容,通過驗證的用戶可以獲取解密視頻的密鑰,在客戶端解密后播放。這種方式實現起來流程復雜會帶來更多的計算量。

一般結合這兩種技術一起用,第1種技術很成熟也有很多教程就不再復述,本文主要介紹第2種加密技術。

流媒體加密技術原理

看視頻分為兩種,看點播和看錄播。
要看點播可以通過下載完整個視頻后再看,或者通過流媒體邊下邊看。
看直播只能通過流媒體看最新的畫面。

加密整個視頻的技術很簡單,把視頻看成一個文件采用加密文件的技術,這種技術太多就不介紹了。
加密流媒體的技術很少,也很難找到學習資料,本文主要介紹流媒體加密技術。

常見的應用與瀏覽器播放的流媒體傳輸協議有:

  • HLS:Apple 推出的基於 HTTP 協議的 MP4 分片傳輸協議,可用於點播和直播場景。每下載一個分片都需要發生一次 HTTP 請求,所以嚴格來說 HLS 不能稱為流媒體傳輸協議。
  • HTTP-FLV:基於 HTTP 長連接的 FLV 分塊 tag 傳輸協議,可用於點播和直播場景。
  • RTMP:基於 TCP 的 FLV 分塊 message 傳輸協議,用於 Flash 客戶端。

流媒體加密原理

可以看出一個規律這些流媒體傳輸協議都必須把視頻流拆分成連續的小塊之后再被傳送,只不過分塊的大小和視頻容器的格式不一樣而已。

流媒體加密技術的核心就在於對這每一小塊視頻分別使用對稱加密算法,在服務端加密客戶端解密,通過權限驗證的用戶才能拿到解密一小塊視頻的密鑰。

為什么不用 HTTPS 加密

可能有人會問為什么不用 HTTPS 加密?原因是 HTTPS 在網絡傳輸層進行非對稱加密,目的是為了防止中間人竊聽劫持,任何人都可以和我們的服務器建立 HTTPS 鏈接獲取到原數據。而視頻加密的目的不是為了防止有中間人竊聽我們的視頻數據,而是要讓視頻數據本身被加密。

為什么選擇對稱加密

現代成熟的加密技術分為對稱加密算法和公鑰密碼算法(非對稱加密)。之所以選擇對稱加密是因為流媒體要求很強的實時性,數據量又很大。公鑰密碼算法的計算都比較復雜,效率較低,適合對少量數據進行加密。對稱加密效率相對較高,所以流媒體加密首選對稱加密。例如在 SSH 登入的時候會先通過公鑰密碼算法傳輸一個密鑰,再用這個密鑰用作對稱加密算法的密鑰,在數據傳輸過程中使用對稱加密算法來提示數據傳輸效率。

HLS 加密

HLS 是目前最成熟的支持流媒體加密的能應用在瀏覽器里的流媒體傳輸協議,HLS 原生支持加密,下面來詳細介紹它。

在介紹如何加密 HLS 先了解下 HLS 相比於其它流媒體傳輸協議的優缺點。
優點在於:

  • 建立在 HTTP 之上,使用簡單,接入代價小。
  • 分片技術有利於 CDN 加速技術的實施。
  • 部分瀏覽器原生支持,支持點播和錄播。

缺點在於:

  • 用作直播時延遲太大。
  • 移動端支持還好,PC端只有 Safari 原生支持。

HLS 加密原理

HLS 由兩部分構成,一個是 .m3u8 文件,一個是 .ts 視頻文件(TS 是視頻文件格式的一種)。整個過程是,瀏覽器會首先去請求 .m3u8 的索引文件,然后解析 m3u8,找出對應的 .ts 文件鏈接,並開始下載。
hls

m3u8 文件是一個文本文件,在開啟 HLS 加密時,內容大致如下:

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:26
#EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.do?k=1"
#EXTINF:9.901,
http://media.example.com/segment26.ts
#EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.do?k=2"
#EXTINF:9.501,
http://media.example.com/segment28.ts

這個文件描述了每個 TS 分片的 URL ,但這些分片都是加密后的內容,要還原出原內容需要從

#EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.do?k=1"

中解析出獲取解密密鑰的URL https://priv.example.com/key.do 和對稱加密算法 AES-128 。
獲取到密鑰后再在客戶端解密出原內容。
可以看出啟用 HLS 加密后會多出更多的事情:

  • 針對每個 TS 需要去請求獲取密鑰。
  • 需要多提供一個給客戶端獲取密鑰的鑒權服務。
  • 針對每個 TS 需要去執行對稱加密的解密計算。

這會帶來更多的網絡請求和計算量,可能會對延遲和性能造成一定的不良影響。

HLS 加密實戰

支持 HLS 的客戶端都原生支持加密,所以要開啟 HLS 加密你只需要修改你的服務端:

  • 修改 HLS 視頻服務,對 TS 加密,往 m3u8 中加入 EXT-X-KEY 字段。
  • 提供給客戶端獲取密鑰的鑒權服務,即上面的 https://priv.example.com/key.do?k=1 所指向的服務。

目前大多數雲服務都支持 HLS 加密服務,如果你想直接搭建 HLS 加密服務可以使用 nginx-rtmp-module

HLS 兼容方案

目前 HLS 存在兼容性問題:

  • 針對桌面端低版本瀏覽器例如 IE,可以使用 Flash 技術來播放 HLS ,詳細使用見開源項目 flashls
  • 針對非Safari高版本瀏覽器例如 Chrome ,可以使用 Media Source Extensions API 去實現播放 HLS,詳細使用見開源項目 hls.js
  • 針對即不原生支持 HLS又不支持 Media Source Extensions 也不支持 Flash 的瀏覽器,常見於部分低版本移動端瀏覽器,我也找不到什么好辦法。

flashls 和 hls.js 都支持 HLS 加密技術。

破解 HLS 加密

有加密就有破解,在明白 HLS 加密原理后,你想過如何去破解它嗎?先定義下破解成功是指:獲取到視頻加密前的完整原文件。我想到的方法是:

  1. 先付費買一個可正常觀看受保護視頻的賬號。
  2. 用抓包工具抓下所有網絡請求(可以篩選下限制到只保存 HLS 和 獲取key 的請求,防止保存太多垃圾數據)。
  3. 第2步保存下來了加密后的 TS 分片和加密分片所需要的密鑰。
  4. 寫一個腳本以 m3u8 為索引一一解密出加密后的 TS 分片的原文件,再把 TS 拼接成完整的視頻原文件。

似乎破解的難度也不會很復雜。

總結

目前流媒體加密技術還不成熟,除了 HLS 協議提供了方便成熟的方案外,其它協議的加密技術還不成熟。

RTMP 協議提供了一個變種版 RTMPE 可以加密流媒體,原理和 HLS 加密類似,但是我還找不到合適的服務端去支持 RTMPE 協議。


免責聲明!

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



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