本文只討論應用於瀏覽器環境的流媒體協議的加密nginx
付費觀看視頻的模式是不少平臺的核心業務,若是視頻被錄製並不是法傳播,付費業務將受到嚴重威脅。所以對視頻服務進行加密的技術變得尤其重要。git
本文所指的視頻加密是爲了讓要保護的視頻不能輕易被下載,即便下載到了也是加密後的內容,其它人解開加密後的內容須要付出很是大的代價。github
沒法作到嚴格的讓要保護的視頻不被錄製,緣由在於你須要在客戶端播放出視頻的原內容,解密的流程在客戶端的話不法分子就能模擬整個流程,最保守也能用屏幕錄製軟件錄製到視頻的原內容(能夠經過加水印的方法緩解下)。咱們的目標是讓他獲取原內容的代價更大。算法
視頻加密技術分爲兩種:瀏覽器
通常結合這兩種技術一塊兒用,第1種技術很成熟也有不少教程就再也不復述,本文主要介紹第2種加密技術。bash
看視頻分爲兩種,看點播和看錄播。
要看點播能夠經過下載完整個視頻後再看,或者經過流媒體邊下邊看。
看直播只能經過流媒體看最新的畫面。服務器
加密整個視頻的技術很簡單,把視頻當作一個文件採用加密文件的技術,這種技術太多就不介紹了。
加密流媒體的技術不多,也很難找到學習資料,本文主要介紹流媒體加密技術。網絡
常見的應用與瀏覽器播放的流媒體傳輸協議有:ide
能夠看出一個規律這些流媒體傳輸協議都必須把視頻流拆分紅連續的小塊以後再被傳送,只不過度塊的大小和視頻容器的格式不同而已。工具
流媒體加密技術的核心就在於對這每一小塊視頻分別使用對稱加密算法,在服務端加密客戶端解密,經過權限驗證的用戶才能拿到解密一小塊視頻的密鑰。
可能有人會問爲何不用 HTTPS 加密?緣由是 HTTPS 在網絡傳輸層進行非對稱加密,目的是爲了防止中間人竊聽劫持,任何人均可以和咱們的服務器創建 HTTPS 連接獲取到原數據。而視頻加密的目的不是爲了防止有中間人竊聽咱們的視頻數據,而是要讓視頻數據自己被加密。
現代成熟的加密技術分爲對稱加密算法和公鑰密碼算法(非對稱加密)。之因此選擇對稱加密是由於流媒體要求很強的實時性,數據量又很大。公鑰密碼算法的計算都比較複雜,效率較低,適合對少許數據進行加密。對稱加密效率相對較高,因此流媒體加密首選對稱加密。例如在 SSH 登入的時候會先經過公鑰密碼算法傳輸一個密鑰,再用這個密鑰用做對稱加密算法的密鑰,在數據傳輸過程當中使用對稱加密算法來提示數據傳輸效率。
HLS 是目前最成熟的支持流媒體加密的能應用在瀏覽器裏的流媒體傳輸協議,HLS 原生支持加密,下面來詳細介紹它。
在介紹如何加密 HLS 先了解下 HLS 相比於其它流媒體傳輸協議的優缺點。
優勢在於:
缺點在於:
HLS 由兩部分構成,一個是 .m3u8 文件,一個是 .ts 視頻文件(TS 是視頻文件格式的一種)。整個過程是,瀏覽器會首先去請求 .m3u8 的索引文件,而後解析 m3u8,找出對應的 .ts 文件連接,並開始下載。
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 加密後會多出更多的事情:
這會帶來更多的網絡請求和計算量,可能會對延遲和性能形成必定的不良影響。
支持 HLS 的客戶端都原生支持加密,因此要開啓 HLS 加密你只須要修改你的服務端:
EXT-X-KEY
字段。https://priv.example.com/key.do?k=1
所指向的服務。目前大多數雲服務都支持 HLS 加密服務,若是你想直接搭建 HLS 加密服務可使用 nginx-rtmp-module。
目前 HLS 存在兼容性問題:
flashls 和 hls.js 都支持 HLS 加密技術。
有加密就有破解,在明白 HLS 加密原理後,你想過如何去破解它嗎?先定義下破解成功是指:獲取到視頻加密前的完整原文件。我想到的方法是:
彷佛破解的難度也不會很複雜。
目前流媒體加密技術還不成熟,除了 HLS 協議提供了方便成熟的方案外,其它協議的加密技術還不成熟。
RTMP 協議提供了一個變種版 RTMPE 能夠加密流媒體,原理和 HLS 加密相似,可是我還找不到合適的服務端去支持 RTMPE 協議。