Szyfrowanie multimediów

Derek Herman
Derek Herman
Jan Kowalski
Joe Medley

W tej sekcji omówimy dwie różne strategie szyfrowania multimediów oraz praktyczne przykłady użycia ich z użyciem programów FFmpeg i Shaka Packager. Dwie strategie szyfrowania, które omówimy, to Clear Key (Wyczyść klucz) i usługę taką jak Google Widevine. Obie te strategie to rodzaj zarządzania prawami cyfrowymi (DRM), który pozwala kontrolować, co użytkownicy mogą robić z Twoimi multimediami. Jeden z nich jest jednak z natury mniej bezpieczny od drugiego ze względu na sposób przekazywania kluczy do uwierzytelniania i dlatego lepiej użyć usługi DRM.

Głównymi usługami DRM w internecie są Google Widevine, Microsoft PlayReady i Apple FairPlay, ale w tym artykule nie omówimy ich wszystkich. Jeśli jednak kierujesz reklamy na wszystkie nowoczesne przeglądarki, prawdopodobnie będziesz korzystać ze wszystkich 3 usług DRM.

Konwersja i szyfrowanie są realizowane za pomocą następujących aplikacji:

Wyczyść szyfrowanie klucza

Przed użyciem klucza Clear Key musisz dobrze zrozumieć, co to jest, a czym nie. Jeśli nie chcesz korzystać z istniejącej usługi DRM i uważasz, że podstawowe szyfrowanie multimediów jest dobrym rozwiązaniem, możesz użyć Clear Key. Pamiętaj jednak, że ten typ szyfrowania nie zapewnia takiego samego poziomu bezpieczeństwa jak korzystanie z jednej z usług DRM. Dzieje się tak, ponieważ para klucz-wartość nie jest szyfrowana pod innym kluczem w przeciwieństwie do zaszyfrowanych kluczy generowanych przez klucz odszyfrowywania przechowywany na serwerze licencji. Dodatkowo funkcja Clear Key wysyła parę klucz-wartość w postaci zwykłego tekstu, więc podczas szyfrowania multimediów klucz do odszyfrowania nie jest obiektem tajnym.

Utwórz klucz

W ten sam sposób możesz utworzyć klucz na potrzeby DASH i HLS. Do tego celu użyj OpenSSL. Poniżej utworzysz klucz szyfrowania złożony z 16 wartości szesnastkowych.

openssl rand -hex 16 > media.key

Tworzenie IV

Następnie możemy wygenerować wektor inicjujący (IV).

openssl rand -hex 16
6143b5373a51cb46209cfed0d747da66

Szyfrowanie za pomocą czyszczenia klucza

W tym przykładzie użyto narzędzia Shaka Packager z nieprzetworzonymi kluczami, gdzie keys i key_ids są udostępniane bezpośrednio do Shaka Packager. Więcej przykładów znajdziesz w dokumentacji.

W przypadku flagi key użyj utworzonego wcześniej klucza, który jest przechowywany w pliku media.key. Podczas wpisywania go w wierszu poleceń pamiętaj jednak, aby usunąć z niego odstępy. W przypadku flagi key_id powtórz wartość media.id lub użyj wartości IV wygenerowanej powyżej.

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

Tworzenie pliku z kluczowymi informacjami

Aby szyfrować w ramach HLS, oprócz pliku klucza musisz mieć plik z informacjami o kluczu. Plik z kluczowymi informacjami to plik tekstowy w formacie podanym poniżej. Powinien mieć rozszerzenie .keyinfo. Przykład: encrypt.keyinfo.

key URI
key file path
private key

Identyfikator URI klucza to miejsce na serwerze, w którym znajduje się obiekt media.key (utworzony powyżej). Ścieżka pliku klucza to jego lokalizacja względem pliku z informacjami o kluczach. Klucz prywatny to zawartość samego pliku media.key lub wcześniej utworzonego IV. Na przykład:

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

Szyfrowanie dla 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/"

To polecenie akceptuje klucz o długości 16 lub 32 znaków.

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

Szyfrowanie Widevine

Teraz wiesz już, czym jest szyfrowanie klucza i kiedy go używać. Kiedy jednak warto użyć usługi DRM, aby zwiększyć bezpieczeństwo? W takim przypadku do bezpiecznego szyfrowania i odszyfrowywania multimediów służy Widevine lub inna usługa. Widevine obsługuje standard MPEG-DASH i HLS i jest DRM od Google. Z Widevine korzystają przeglądarki Google Chrome i Firefox, Android MediaDRM, Android TV oraz inne urządzenia elektroniczne korzystające z rozszerzeń zaszyfrowanych multimediów oraz rozszerzeń źródła multimediów, przy czym Widevine odszyfrowuje treści.

Zaszyfruj przez Widevine

W większości przykładów w tym artykule użyto szyfrowania Clear Key. W przypadku Widevine warto jednak zastąpić poniższe opcje.

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

Cała zawartość polecenia demultipleksera (demux) z wyjątkiem nazw plików i flagi --content-id powinna zostać skopiowana dokładnie z przykładu. Wartość --content-id składa się z 16 lub 32 losowych cyfr szesnastkowych. Użyj podanych tutaj kluczy zamiast własnych. Więcej przykładów znajdziesz w dokumentacji Shaka Packager na temat używania Widevine Key Server.

  1. Demux (rozdzielaj) dźwięk i obraz, szyfruj nowe pliki i generuj plik opisu prezentacji multimedialnej (Media Presentation description (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. Zremiksować (połączyć) strumienie audio i wideo. Jeśli używasz struktury wideo, może nie być konieczne wykonanie tej czynności.

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

Sekwencja konwersji multimediów

W tej sekcji znajdziesz polecenia w kolejności potrzebne do przesłania danych z nieprzetworzonego pliku .mov do zaszyfrowanych zasobów w pakiecie na potrzeby DASH lub HLS. Aby zilustrować Twoje dane, konwertujemy plik źródłowy na szybkość transmisji bitów 8 MB i rozdzielczość 1080p (1920 x 1080). Dostosowuj wartości do swoich potrzeb.

DASH/WebM

  1. Przekonwertuj typ pliku i kodek.

    W przypadku tego polecenia możesz użyć kodeka audio liborbis lub libopus.

    ffmpeg -i glocken.mov -c:v libvpx-vp9 -c:a libvorbis -b:v 8M -vf setsar=1:1 -f webm tmp_glocken.webm
    
  2. Utwórz klucz szyfrowania Clear Key.

    openssl rand -hex 16 > media.key
    
  3. Demux (rozdzielaj) dźwięk i obraz, szyfruj nowe pliki i generuj plik opisu prezentacji multimedialnej (Media Presentation description (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. Zremiksować (połączyć) strumienie audio i wideo. Jeśli używasz struktury wideo, może nie być konieczne wykonanie tej czynności.

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

DASH/MP4

  1. Konwertuj typ pliku, kodek wideo i szybkość transmisji bitów.

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 tmp_glocken.mp4
    
  2. Utwórz klucz szyfrowania Clear Key.

    openssl rand -hex 16 > media.key
    
  3. Demux (rozdzielaj) dźwięk i obraz, szyfruj nowe pliki i generuj plik opisu prezentacji multimedialnej (Media Presentation description (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. Zremiksować (połączyć) strumienie audio i wideo. Jeśli używasz struktury wideo, może nie być konieczne wykonanie tej czynności.

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

HLS/MP4

HLS obsługuje tylko MP4, więc najpierw musisz przekonwertować go na kontener MP4 i obsługiwane kodeki.

  1. Konwertuj typ pliku, kodek wideo i szybkość transmisji bitów.

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 glocken.mp4
    
  2. Utwórz klucz szyfrowania Clear Key.

    openssl rand -hex 16 > media.key
    
  3. Tworzenie pliku z kluczowymi informacjami

    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
    

Wymagało to dużo czasu. Mam nadzieję, że teraz możesz pewnie szyfrować multimedia. Następnie pokażemy Ci, jak dodawać multimedia do witryny.