流媒體加密

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

爲何要加密視頻

付費觀看視頻的模式是不少平臺的核心業務,若是視頻被錄製並不是法傳播,付費業務將受到嚴重威脅。所以對視頻服務進行加密的技術變得尤其重要。git

本文所指的視頻加密是爲了讓要保護的視頻不能輕易被下載,即便下載到了也是加密後的內容,其它人解開加密後的內容須要付出很是大的代價。github

沒法作到嚴格的讓要保護的視頻不被錄製,緣由在於你須要在客戶端播放出視頻的原內容,解密的流程在客戶端的話不法分子就能模擬整個流程,最保守也能用屏幕錄製軟件錄製到視頻的原內容(能夠經過加水印的方法緩解下)。咱們的目標是讓他獲取原內容的代價更大。算法

常見視頻加密技術

視頻加密技術分爲兩種:瀏覽器

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

通常結合這兩種技術一塊兒用,第1種技術很成熟也有不少教程就再也不復述,本文主要介紹第2種加密技術。bash

流媒體加密技術原理

看視頻分爲兩種,看點播和看錄播。
要看點播能夠經過下載完整個視頻後再看,或者經過流媒體邊下邊看。
看直播只能經過流媒體看最新的畫面。服務器

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

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

  • 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
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 協議。

閱讀原文

相關文章
相關標籤/搜索