ffmpeg分解視訊檔案並加密
ffmpeg,可以將視訊分解成小塊,並根據金鑰進行內容加密。首先需要將金鑰寫入檔案video.key。
還需要第二個檔案,key_info來儲存是關鍵資訊檔案。它具有以下格式:
key URI
key file path
IV (optional)
例如:
http://example.com/video.key
video.key
ffmpeg可以用這個hls_key_info引數來加密你的細分視訊:
ffmpeg -i input.mp4 -c copy -bsf:v h264_mp4toannexb -hls_time 10 -hls_key_info_file key_info playlist.m3u8
這將使用CBC模式的AES-128加密您的細分,並將相關標籤新增到播放列表:
#EXT-X-KEY:METHOD=AES-128,URI="http://example.com/video.key"
如果需要,您也可以手動加密細分openssl。這裡是一個示例指令碼,其中每個IV等於段索引:
#!/bin/bash ts_dir=/path/to/ts/ key_file=video.key openssl rand 16 > $key_file enc_key=$(hexdump -v -e '16/1 "%02x"' $key_file) pushd $ts_dir ts_cnt=$(ls *.ts | wc -l) ((ts_cnt--)) i=0 for i in $(seq -f "%01g" 0 $ts_cnt); do iv=$(printf '%032x' $i) ts_file=segment-$i.ts echo [$i] $ts_file openssl aes-128-cbc -e -in $ts_file -out encrypted_${ts_file} -nosalt -iv $iv -K $enc_key done popd
另外一個可以參考的命令列例子:
ffmpeg -i input.mp4 -f segment -segment_times 10,20 -c copy -map 0 output02%d.mp4
以下資訊來源於亞馬遜
內容保護
AES-128內容加密
許多不同的流協議已經認識到對內容保護的需求,這些協議已經以各種形式和風格增加了對內容保護的支援。協議的第一稿HLS規範中已經存在AES-128加密,將內容保護置於優先順序列表中。實際上,HLS有兩種加密方案:
-
AES-128加密:這意味著使用 128位金鑰的高階加密標準對媒體段進行完全 加密。它還允許使用初始化向量來優化保護。
-
樣本AES:在這種情況下,各個媒體樣本使用AES標準加密。使用此加密級別,流容器未完全加密。此外,加密樣本如何封裝,取決於片段的媒體格式。
實際上,AES-128是HLS中最常用的加密方法。這種方法通常也是使用標準流伺服器和工具來實現的最簡單的方法。
這種AES-128保護有多安全?
處理內容保護的第一個問題通常是:“這種保護有多安全?為了理解這一點,我們來看看AES加密是什麼。AES是一種對稱加密演算法。它被設計為在硬體和軟體方面都是高效的。該演算法在全球範圍內得到應用,被美國政府用作加密敏感資料的標準加密演算法。此外,它是大多數DRM系統的基礎,例如Microsoft Playready,Widevine和Verimatrix。AES加密的使用最近也成為MPEG-DASH通用加密標準的一部分。一般來說,這個級別的AES加密可能很快就不會被破壞。
AES加密本身可以被宣告安全。但是,加密只是最弱點的安全。還需要看一下解密金鑰的安全性。這是許多DRM技術所關注的領域。他們認為關鍵保護至關重要,通常採用非常晦澀或複雜的方案來檢索解密金鑰。通過AES-128內容保護,金鑰檢索工作保持簡單,易於實現。它也留有足夠的自由使關鍵保護儘可能簡單或高階。
如何保護解密金鑰?
HLS規範僅提及金鑰檢索的一個方面:可以載入金鑰的URL應該是清單檔案的一部分。保護此資源取決於釋出商本身。大多數情況下,我們看到了許多不同的保護解密金鑰的方法:
-
保護清單:這依賴於將URL隱藏到解密金鑰。它不提供高水平的安全性,因為URL可能洩漏或可能在網路上被攔截。
-
使用身份驗證Cookie:驗證Cookie可由玩家傳送金鑰請求。這允許金鑰伺服器檢查哪個使用者正在請求金鑰。如果使用者不允許訪問流,則不會返回金鑰。結果,只有具有正確認證的使用者才能接收解密金鑰。
-
利用簽名的URL:通過為每個使用者提供唯一的清單,可以使用簽名的URL。然後,使用者特定的清單將包含一個包含認證令牌的解密金鑰的連結。然後,伺服器可以檢查認證令牌,並確定是否可以訪問金鑰。
在實踐中使用AES-128加密
這當然是AES-128加密在實踐中可以使用的問題。使用AES-128加密可以通過加密您的媒體檔案,並使用清單檔案中的EXT-X-KEY標籤進行信令。該標籤將URL傳送到解密金鑰。它應放在第一個段之前,該段是用給定的金鑰加密的。這個標籤可以發生兩個極端:
-
有一次在清單的頂部。這意味著所有段都使用相同的解密金鑰加密。在解密金鑰被攔截的情況下,整個流可以被解密。
-
用不同的URL每個段之前。這種方法允許您使用不同的金鑰加密每個段。金鑰允許您解密單個段,其中只包含幾秒鐘的媒體資訊。
在這兩個極端之間,您可以自由選擇自己重新整理加密金鑰的頻率。下面你可以找到一個示例清單,每兩個段可以旋轉加密金鑰:
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-KEY:METHOD = AES-128,URI = https://security.theoplayer.com/sequence-1.key”
#EXTINF:10.0,http://media.theoplayer.com/video1/sequence-1-segment-1.ts
#EXTINF:10.0,http://media.theoplayer.com/video1/sequence-1-segment-2.TS
#EXT-X-KEY:METHOD = AES-128,URI = “https://security.theoplayer.com/sequence-2.key”
#EXTINF:10.0,http://media.theoplayer.com/video1/sequence-2-segment-1.ts
#EXTINF:10.0,http://media.theoplayer.com/video1/sequence-2-segment-2.ts
#EXT-X-ENDLIST