随着線上視訊和線上教育以的興起,線上視訊系統越來越多,如線上知識網站、線上課程、線上教育教育訓練等網站,我們之前講過關于視訊網站的搭建、視訊的雲存儲、視訊的加速播放等,今天的主要話題是視訊内容如何防盜鍊或者防止非法下載下傳。
我們之前有講過一篇文章,視訊播放如何實作防盜鍊,此文主要是對播放位址加Token的方式來實作放盜鍊,但是token很容易擷取,并且視訊檔案也很容易緩存下來,來将緩存的視訊進行提取即可。
本文主要介紹,通過對視訊内容檔案進行加密的方式來實作放盜鍊,這樣可以避免非授權使用者通過播放URL下載下傳或播放點播視訊,有效的實作對視訊内容的版權保護,算是更進階的加密方式。
加密過程
視訊的播放格式介紹
先介紹一下網站的流媒體視訊播放格式,HLS,Http Live Streaming 是由Apple公司定義的用于實時流傳輸的協定,HLS基于HTTP協定實作,傳輸内容包括兩部分,一是m3u8描述檔案,二是TS媒體檔案,統稱M3U8格式。
m3u8格式的檔案隻是存儲多媒體播放清單,提供了一個指向其他位置的音頻視訊檔案的索引,你播放的還是那些被指向的檔案,是一系列的TS檔案,本分成多個TS檔案主要是為了友善加載,比如使用者拖動進度條,就可以直接跳轉到對應的TS檔案即可,不需要加載整個視訊檔案,因而節省了網絡帶寬。
m3u8格式的優點:
- 可以多碼率的适配。根據網絡帶寬,用戶端會自動選擇一個适合自己碼率的檔案進行播放,保證視訊流的流暢,代表是蘋果的HLS(HTTP Live Streaming)。HLS有一個特點:自适應碼率流播(adaptive streaming),用戶端可以根據網絡狀況自動選擇不同碼率的視訊流,條件允許的情況下使用高碼率,網絡繁忙的時候使用低碼率,并且自動在二者間随意切換。這對移動裝置網絡狀況不穩定的情況下保障流暢播放非常有幫助。
- 降低源伺服器的負載壓力。M3U的特點是将流媒體切分為若幹 TS 片段,然後通過一個擴充的 m3u 清單檔案将這些 TS 片段集中起來供用戶端播放器接收。這樣做相比使用 RTSP 協定的好處在于,一旦切分完成,之後的分發過程完全不需要額外使用任何專門軟體,普通的網絡伺服器即可,大大降低了 CDN 邊緣伺服器的配置要求,可以使用任何現成的CDN。分發使用的協定是最常見 HTTP,代理伺服器對這個協定的緩存優化相當成熟,而很少有代理伺服器對 RTSP 地進行緩存優化。
- 對于非實時視訊,播放使用HTTP協定的單個 MP4 格式的視訊檔案時,需要代理伺服器支援 HTTP range request 以擷取大檔案中的一部分,但不是所有的代理伺服器都對此有良好的支援。而 M3U 則隻需要根據清單檔案中的時間軸找出對應的 TS 片段下載下傳即可,不需要 range request,對代理伺服器的要求小很多。所有代理伺服器都支援小檔案的高效緩存。
- 為什麼要用 TS 而不是 MP4,這是因為兩個 TS 片段可以無縫拼接,播放器能連續播放,而 MP4 檔案由于編碼方式的原因,兩段 MP4 不能無縫拼接,播放器連續播放兩個 MP4 檔案會出現破音和畫面間斷,影響使用者體驗。
TS流程
視訊加密實作原理
視訊網站的加密就是對HLS/M3U8檔案的加密,使用HLS加密時,初時生成的密鑰是存儲在點播服務中的,業務側在初步播放時需要從點播中查詢擷取密鑰,這要求業務側自行搭建密鑰管理服務,組裝帶token的播放url,從點播服務中擷取密鑰,緩存後再傳回給播放器解密播放。
視訊加密原理,主要是通過指定的AES-128加密算法來加密每一個TS,并在生成的m3u8檔案中描述播放器如何解密TS檔案的方法,支援所有的HLS播放器,前端播放器根據業務規則,擷取解密秘鑰,然後解密TS檔案,進行解密播放。
加密流程
加密過程:
- 業務側将視訊上傳到點播服務(VOD)後,請求HLS加密。
- 點播服務收到加密請求後,向KMS請求加密密鑰,并将擷取的密鑰ID和密鑰密文存儲在點播服務中。
- 點播服務向媒體處理服務請求HLS加密,媒體處理服務通過轉碼功能将對應的視訊進行加密。
- 轉碼加密後生成的m3u8檔案帶有“#EXT-X-KEY”标簽,該标簽包含了“METHOD”和“URI”屬性,其中“URI”即為業務側搭建的密鑰管理服務的位址。
- 加密後,點播服務通過CDN将加密的HLS視訊檔案進行加速分發。
解密過程:
- 終端使用者登入播放器終端,業務側會對終端使用者進行身份校驗,校驗通過後,會為播放終端配置設定一個Token,并将帶Token的播放位址傳回給播放器端。
- 播放器終端通過帶Token的播放URL向CDN請求播放。由于Token是動态的,是以CDN收到請求後,會直接回源到點播服務。點播服務會将請求URL中的Token寫入請求的m3u8檔案的“URI”中。點播服務傳回給CDN的m3u8檔案中會攜帶播放終端的Token值。
- 播放終端解析傳回的m3u8檔案,得到EXT-X-KEY标簽中的“URI”内容,向“URI”請求密鑰。
- 業務側的密鑰管理服務收到請求後,先驗證Token的合法性,若Token合法,則通過調用點播服務的API查詢密鑰。
- 密鑰管理服務可以選擇将查詢到的密鑰緩存在本地,當下次有其它播放終端請求時,可以直接傳回,無需每次都向點播服務擷取。
- 密鑰管理服務将點播服務傳回的密鑰傳回給播放終端。播放終端通過擷取的密鑰解密播放m3u8檔案。
代碼實作方式
加密服務一般由第三方服務實作,以及直接格式轉換,比如一些雲廠商或者視訊托管廠商,如果要自建,用萬能的 ffmpeg 也可以實作,簡單過程如下:
1. Key檔案
#!/bin/sh BASE_URL=${1:-'.'}
openssl rand 16 > file.key
echo $BASE_URL/file.key > file.keyinfo
echo file.key >> file.keyinfo
echo $(openssl rand -hex 16) >> file.keyinfo
參數詳解:
BASE_URL:網站url位址
openssl rand 16 > file.key 生成一個key檔案
echo $BASE_URL/file.key > file.keyinfo 将外部通路的file.key映射到file.keyinfo檔案中。
echo file.key >> file.keyinfo 将項目file.key所在的檔案路徑映射到fike.keyinfo檔案中。
echo $(openssl rand -hex 16) >> file.keyinfo 生成IV密鑰
2. 執行指令
ffmpeg -y -i 視訊檔案絕對路徑/202203271023300d469.mp4 \
-preset:v veryfast -hls_time 5 -c:a aac -hls_key_info_file ase加密檔案的絕對路徑/file.keyinfo \
-hls_segment_filename 轉碼之後的ts檔案的存放路徑/%04d.ts \
-hls_list_size 0 轉碼之後m3u8檔案存放的絕對路徑/index.m3u8
參數說明:
-hls_key_info_file 加密檔案的路徑 這個指令是轉碼之後ts檔案是否加密的關鍵指令
轉換加密前的檔案
轉換後的檔案
結論
是以,對TS的加密進而達到對視訊加密的目的,将加密後的視訊位址存放到CMS管理,在APP/網站等播放器端進行技術對接,使得加密視訊隻能在特定的APP/網站中使用,即使使用者下載下傳了TS檔案,也無法解密播放,安全性更高。
最終使用了加密播放的視訊,可以實作有效的版權保護、二次售賣等一些使用者的非法操作,進而實作了對我們内容的有效保護。
關于視訊網站的搭建可以參考之前的文章:
CMS建構課程平台:如何解決播放流量和帶寬的問題
通過CMS建構視訊課程平台
歡迎轉載,請注明出處!
===================
大家好,我是Robbin,來給大家講CMS。
主要講解如何使用開源Drupal + 可視化工具GrapeJS (建構)=> 可視化、子產品化、低代碼的、易上手的CMS平台。
可以快速建構網站、手機站、産品站、線上教育、課程售賣、售後咨詢等平台的工具。
==================