1. 程式人生 > >ffmpeg分解視訊檔案並加密

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傳送到解密金鑰。它應放在第一個段之前,該段是用給定的金鑰加密的。這個標籤可以發生兩個極端:

  1. 有一次在清單的頂部。這意味著所有段都使用相同的解密金鑰加密。在解密金鑰被攔截的情況下,整個流可以被解密。

  2. 用不同的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