媒體加密

德瑞克赫曼
Derek Herman
喬梅利
Joe Medley

本節將說明兩種加密媒體的策略,並舉例說明如何與 FFmpeg 和 Shaka Packager 搭配使用。我們將討論的兩種加密策略是「Clear Key」,以及使用 Google Widevine 等服務。這兩種策略都是數位版權管理 (DRM) 的形式,可控管使用者可透過您的媒體執行的操作。不過,由於在驗證過程中傳遞金鑰的方式,所以其中的安全性也比較低,這也是為何 DRM 服務較為合理。

網路服務的主要數位版權管理服務是 Google WidevineMicrosoft PlayReadyApple FairPlay,但本文並未涵蓋所有相關內容。不過,如果您指定所有新版瀏覽器,就可能會使用全部三種 DRM 服務。

系統會透過以下應用程式執行轉換和加密作業:

清除金鑰加密

首先,您應該在使用「Clear Key」(清除金鑰) 之前,您應該大致瞭解什麼是「清除金鑰」。如果您「不想」使用現有的 DRM 服務,且認為媒體進行基本加密是可行的,請使用「Clear Key」。不過請注意,這種加密方式的安全性等級並不會與使用任何 DRM 服務相同。這是因為金鑰/值組合不會使用其他金鑰加密,這一點與由儲存在授權伺服器上的解密金鑰產生的加密金鑰不同。此外,Clear Key 會以純文字格式傳送鍵/值組合,因此在加密媒體時,金鑰解密並不是密鑰。

建立金鑰

您可以使用相同的方法同時建立 DASH 和 HLS 的索引鍵。請使用 OpenSSL 來執行這項操作。下列步驟會建立由 16 個十六進位值組成的加密金鑰。

openssl rand -hex 16 > media.key

建立 IV

接下來,我們可以產生初始化向量 (IV)。

openssl rand -hex 16
6143b5373a51cb46209cfed0d747da66

使用 Clear Key 加密

以下範例使用含原始金鑰的 Shaka Packager,其中 keyskey_ids 會直接提供給 Shaka Packager。如需更多範例,請參閱說明文件。

針對 key 旗標,請使用先前建立的金鑰,該金鑰儲存於 media.key 檔案。不過,在指令列中輸入時,請務必移除該空白字元。針對 key_id 旗標,請重複 media.id 值或使用上述產生的 IV 值。

packager \
  input=glocken.mp4,stream=audio,output=glockena.m4a \
  input=glocken.mp4,stream=video,output=glockenv.mp4 \
  --enable_fixed_key_encryption \
  --keys label=audio:key=INSERT_AUDIO_KEY_HERE:key_id=INSERT_AUDIO_KEY_ID_HERE,label=video:key=INSERT_VIDEO_KEY_HERE:key_id=INSERT_VIDEO_KEY_ID_HERE

建立重要資訊檔案

除了金鑰檔案之外,你還需要金鑰資訊檔案來為 HLS 加密。金鑰資訊檔案是文字檔案,格式如下所示。其中應有 .keyinfo 擴充功能。例如:encrypt.keyinfo

key URI
key file path
private key

金鑰 URI 是 media.key (在上方建立) 於伺服器上的位置。金鑰檔案路徑是指相對於金鑰資訊檔案的位置。最後,私密金鑰是 media.key 檔案本身或之前建立的 IV 內容。例如:

https://example.com/keys/media.key
/path/to/media.key
6143b5373a51cb46209cfed0d747da66

為 HLS 加密

packager \
  'input=input.mp4,stream=video,segment_template=output$Number$.ts,playlist_name=video_playlist.m3u8' \
  'input=input.mp4,stream=audio,segment_template=output_audio$Number$.ts,playlist_name=audio_playlist.m3u8,hls_group_id=audio,hls_name=ENGLISH' \
  --hls_master_playlist_output="master_playlist.m3u8" \
  --hls_base_url="http://localhost:5000/"

這個指令可接受長度為 16 或 32 個字元的金鑰。

ffmpeg -i myvideo.mov -c:v libx264 -c:a aac -hls_key_info_file encrypt.keyinfo myvideo.m3u8

Widevine 加密

現在,您已瞭解「Clear 金鑰加密」的定義和使用時機。但是,您何時應該使用 DRM 服務來提高安全性?此時,Widevine 或其他服務將用於安全地加密及解密媒體。Widevine 支援 MPEG-DASH 和 HLS,並是 Google 的 DRM。Widevine 適用於 Google Chrome 和 Firefox 網路瀏覽器、Android MediaDRM、Android TV,以及其他使用加密媒體擴充功能和 Media Source Extensions 的消費者電子裝置,其中 Widevine 會將內容解密。

使用 Widevine 加密

本文中的大部分範例都使用 Clear 金鑰加密。然而,如果是 Widevine,您想要取代下列選項。

--enable_fixed_key_encryption \
--enable_fixed_key_decryption \
--keys label=:key=INSERT_KEY_HERE:key_id=INSERT_KEY_ID_HERE

demultiplexer (demux) 指令中的所有內容,除了您的檔案名稱與 --content-id 旗標,都應該完整複製從範例中複製而來。--content-id 是 16 或 32 個隨機十六進位數字。請使用這裡提供的金鑰,而非您自己的金鑰。如需更多範例,請參閱 Shaka 封裝程式說明文件,瞭解如何使用 Widevine Key Server

  1. 分離音訊和影片、加密新檔案,並輸出媒體呈現說明 (MPD) 檔案。

    packager \
      input=tmp_glocken.mp4,stream=video,output=glocken_video.mp4 \
      input=tmp_glocken.mp4,stream=audio,output=glocken_audio.m4a \
      --enable_widevine_encryption \
      --key_server_url "https://license.uat.widevine.com/cenc/getcontentkey/widevine_test" \
      --content_id "fd385d9f9a14bb09" \
      --signer "widevine_test" \
      --aes_signing_key "1ae8ccd0e7985cc0b6203a55855a1034afc252980e970ca90e5202689f947ab9" \
      --aes_signing_iv "d58ce954203b7c9a9a9d467f59839249"
    
  2. Remux (合併) 音訊及視訊串流。如果您使用影片架構,就就不必這麼做

    ffmpeg -i glocken_video.mp4 -i glocken_audio.m4a -c copy glocke.mp4
    

媒體轉換序列

本節會依序顯示從原始 .mov 檔案到為 DASH 或 HLS 封裝的加密資產時所需的指令順序。為了說明目的,我們正在將來源檔案轉換成位元率為 8 MB 的位元率,解析度為 1080p (1920 x 1080)。然後視需求調整這些值。

DASH/WebM

  1. 轉換檔案類型和轉碼器。

    針對這個指令,您可以使用 liborbislibopus 做為音訊轉碼器。

    ffmpeg -i glocken.mov -c:v libvpx-vp9 -c:a libvorbis -b:v 8M -vf setsar=1:1 -f webm tmp_glocken.webm
    
  2. 建立清除金鑰加密金鑰。

    openssl rand -hex 16 > media.key
    
  3. 分離音訊和影片、加密新檔案,並輸出媒體呈現說明 (MPD) 檔案。

    packager \
      input=tmp_glocken.webm,stream=video,output=glocken_video.webm \
      input=tmp_glocken.webm,stream=audio,output=glocken_audio.webm \
      --enable_fixed_key_encryption \
      --enable_fixed_key_decryption \
      --keys label=:key=INSERT_KEY_HERE:key_id=INSERT_KEY_ID_HERE \
      --mpd_output glocken_webm_vod.mpd
    
  4. Remux (合併) 音訊及視訊串流。如果您使用影片架構,就就不必這麼做

    ffmpeg -i glocken_video.webm -i glocken_audio.webm -c copy glocken.webm
    

DASH/MP4

  1. 轉換檔案類型、影片轉碼器和位元率。

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 tmp_glocken.mp4
    
  2. 建立清除金鑰加密金鑰。

    openssl rand -hex 16 > media.key
    
  3. 分離音訊和影片、加密新檔案,並輸出媒體呈現說明 (MPD) 檔案。

    packager \
      input=tmp_glocken.mp4,stream=video,output=glocken_video.mp4 \
      input=tmp_glocken.mp4,stream=audio,output=glocken_audio.m4a \
      --enable_fixed_key_encryption \
      --enable_fixed_key_decryption \
      --keys label=:key=INSERT_KEY_HERE:key_id=INSERT_KEY_ID_HERE \
      --mpd_output glocken_mp4_vod.mpd
    
  4. Remux (合併) 音訊及視訊串流。如果您使用影片架構,就就不必這麼做

    ffmpeg -i glocken_video.mp4 -i glocken_audio.m4a -c copy glocken.mp4
    

HTTP 即時串流/MP4

HLS 僅支援 MP4,因此您必須先轉換為 MP4 容器和支援的轉碼器。

  1. 轉換檔案類型、影片轉碼器和位元率。

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 glocken.mp4
    
  2. 建立清除金鑰加密金鑰。

    openssl rand -hex 16 > media.key
    
  3. 建立重要資訊檔案

    packager \
      'input=glocken.mp4,stream=video,segment_template=output$Number$.ts,playlist_name=video_playlist.m3u8' \
      'input=glocken.mp4,stream=audio,segment_template=output_audio$Number$.ts,playlist_name=audio_playlist.m3u8,hls_group_id=audio,hls_name=ENGLISH' \
      --hls_master_playlist_output="master_playlist.m3u8" \
      --hls_base_url="http://localhost:5000/" \
      --enable_fixed_key_encryption \
      --enable_fixed_key_decryption \
      --keys label=:key=INSERT_KEY_HERE:key_id=INSERT_KEY_ID_HERE
    

這部分的摘要似乎不足,但希望您現在能有自信地加密媒體了。接下來,我們將說明如何在網站中新增媒體