Medienverschlüsselung

Derek Herman
Derek Herman
Joe Medley
Joe Medley

In diesem Abschnitt befassen wir uns mit zwei verschiedenen Strategien zum Verschlüsseln von Medien und mit einigen praktischen Beispielen, wie sie mit FFmpeg und Shaka Packager verwendet werden. Die beiden Strategien, die wir für die Verschlüsselung besprechen, sind Schlüssel löschen und die Verwendung eines Dienstes wie Google Widevine. Beide Strategien sind eine Form der Digital Rights Management (DRM), mit der Sie steuern, was Nutzer mit Ihren Medien tun dürfen. Ein Dienst ist jedoch grundsätzlich weniger sicher als der andere, da Schlüssel zur Authentifizierung übergeben werden. Daher ist ein DRM-Dienst möglicherweise sinnvoller.

Die primären DRM-Dienste für das Web sind Google Widevine, Microsoft PlayReady und Apple FairPlay. Wir werden sie in diesem Artikel jedoch nicht alle behandeln. Wenn Ihre Werbung jedoch auf alle modernen Browser ausgerichtet ist, werden Sie wahrscheinlich alle drei DRM-Dienste nutzen.

Die Konvertierung und Verschlüsselung erfolgt mit folgenden Anwendungen:

Schlüsselverschlüsselung löschen

Zuerst sollten Sie genau wissen, was Clear Key ist und was nicht, bevor Sie ihn verwenden. Wenn Sie einen vorhandenen DRM-Dienst nicht verwenden möchten und der Meinung sind, dass eine grundlegende Verschlüsselung Ihrer Medien eine praktikable Option ist, sollten Sie „Schlüssel löschen“ verwenden. Beachten Sie jedoch, dass diese Art der Verschlüsselung nicht dasselbe Sicherheitsniveau bietet wie die Verwendung eines der DRM-Dienste. Das liegt daran, dass das Schlüssel/Wert-Paar im Gegensatz zu verschlüsselten Schlüsseln, die von einem Entschlüsselungsschlüssel, der auf einem Lizenzserver gespeichert ist, nicht unter einem anderen Schlüssel verschlüsselt wird. Außerdem sendet „Schlüssel löschen“ das Schlüssel/Wert-Paar als Nur-Text. Der Schlüssel zum Entschlüsseln ist also kein geheimer Schlüssel, während Sie Ihre Medien verschlüsseln.

Schlüssel erstellen

Sie können dieselbe Methode verwenden, um einen Schlüssel für DASH und HLS zu erstellen. Verwenden Sie dazu OpenSSL. Mit dem folgenden Befehl wird ein Verschlüsselungsschlüssel aus 16 Hexadezimalwerten erstellt.

openssl rand -hex 16 > media.key

IV erstellen

Als Nächstes können wir einen Initialisierungsvektor (IV) generieren.

openssl rand -hex 16
6143b5373a51cb46209cfed0d747da66

Mit Klarschlüssel verschlüsseln

Im folgenden Beispiel wird Shaka Packager mit Rohschlüsseln verwendet, wobei keys und key_ids direkt an Shaka Packager bereitgestellt werden. Weitere Beispiele finden Sie in der Dokumentation.

Verwenden Sie für das Flag key den zuvor erstellten Schlüssel, der in der Datei media.key gespeichert ist. Achten Sie bei der Eingabe in die Befehlszeile darauf, den zugehörigen Leerzeichen zu entfernen. Wiederholen Sie für das Flag key_id den Wert media.id oder verwenden Sie den oben generierten IV-Wert.

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

Datei mit Schlüsselinformationen erstellen

Zum Verschlüsseln für HLS benötigen Sie zusätzlich zur Schlüsseldatei eine Schlüsselinformationsdatei. Eine Datei mit Schlüsselinformationen ist eine Textdatei im folgenden Format. Sie sollte die Erweiterung .keyinfo haben. Beispiel: encrypt.keyinfo

key URI
key file path
private key

Im Schlüssel-URI befindet sich der oben erstellte media.key auf Ihrem Server. Der Pfad der Schlüsseldatei gibt den Speicherort relativ zur Schlüsselinformationsdatei an. Der private Schlüssel ist schließlich der Inhalt der Datei media.key selbst oder der zuvor erstellten IV. Beispiel:

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

Für HLS verschlüsseln

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

Dieser Befehl akzeptiert einen Schlüssel mit 16 oder 32 Zeichen.

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

Widevine-Verschlüsselung

Jetzt wissen Sie, was die Klarschlüsselverschlüsselung ist und wann Sie sie verwenden sollten. Aber wann sollten Sie einen DRM-Dienst für zusätzliche Sicherheit nutzen? Hier wird Widevine oder ein anderer Dienst verwendet, um Ihre Medien sicher zu verschlüsseln und zu entschlüsseln. Widevine unterstützt MPEG-DASH und HLS und ist ein DRM-Dienst von Google. Widevine wird von den Webbrowsern Google Chrome und Firefox, Android MediaDRM, Android TV und anderen Geräten der Unterhaltungselektronik verwendet, die verschlüsselte Medienerweiterungen und Medienquellenerweiterungen verwenden, wo Widevine Inhalte entschlüsselt.

Mit Widevine verschlüsseln

In den meisten Beispielen in diesem Artikel wurde die Klarschlüsselverschlüsselung verwendet. Für Widevine sollten Sie jedoch die folgenden Optionen ersetzen.

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

Alles im Demultiplexer-Befehl (demux) sollte mit Ausnahme des Namens der Dateien und des Flags --content-id genau aus dem Beispiel kopiert werden. --content-id besteht aus 16 oder 32 zufälligen Hexadezimalziffern. Verwenden Sie anstelle Ihrer eigenen Schlüssel die hier bereitgestellten Schlüssel. Weitere Beispiele finden Sie in der Shaka Packager-Dokumentation zur Verwendung des Widevine Key Server.

  1. Demux (trennen) die Audio- und Videoinhalte, verschlüsseln die neuen Dateien und geben eine MPD-Datei (Media Presentation Description) aus.

    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 (kombiniere) die Audio- und Videostreams. Wenn Sie ein Video-Framework verwenden, ist dies möglicherweise nicht erforderlich.

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

Media-Conversion-Sequenz

In diesem Abschnitt werden Befehle aufgeführt, die erforderlich sind, um von einer .mov-Rohdatei zu verschlüsselten Assets zu gelangen, die für DASH oder HLS verpackt sind. Um das anschaulich darzustellen, wandeln wir eine Quelldatei in eine Bitrate von 8 MB bei einer Auflösung von 1080p (1920 x 1080) um. Passen Sie diese Werte nach Bedarf an.

DASH/WebM

  1. Konvertiere den Dateityp und den Codec.

    Für diesen Befehl können Sie als Audio-Codec entweder liborbis oder libopus verwenden.

    ffmpeg -i glocken.mov -c:v libvpx-vp9 -c:a libvorbis -b:v 8M -vf setsar=1:1 -f webm tmp_glocken.webm
    
  2. Erstellen Sie einen Klaren Schlüsselverschlüsselungsschlüssel.

    openssl rand -hex 16 > media.key
    
  3. Demux (trennen) die Audio- und Videoinhalte, verschlüsseln die neuen Dateien und geben eine MPD-Datei (Media Presentation Description) aus.

    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 (kombiniere) die Audio- und Videostreams. Wenn Sie ein Video-Framework verwenden, ist dies möglicherweise nicht erforderlich.

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

DASH/MP4

  1. Konvertiere den Dateityp, den Video-Codec und die Bitrate.

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 tmp_glocken.mp4
    
  2. Erstellen Sie einen Klaren Schlüsselverschlüsselungsschlüssel.

    openssl rand -hex 16 > media.key
    
  3. Demux (trennen) die Audio- und Videoinhalte, verschlüsseln die neuen Dateien und geben eine MPD-Datei (Media Presentation Description) aus.

    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 (kombiniere) die Audio- und Videostreams. Wenn Sie ein Video-Framework verwenden, ist dies möglicherweise nicht erforderlich.

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

HLS/MP4

HLS unterstützt nur MP4, daher müssen Sie zuerst in den MP4-Container und in die unterstützten Codecs konvertieren.

  1. Konvertiere den Dateityp, den Video-Codec und die Bitrate.

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 glocken.mp4
    
  2. Erstellen Sie einen Klaren Schlüsselverschlüsselungsschlüssel.

    openssl rand -hex 16 > media.key
    
  3. Datei mit Schlüsselinformationen erstellen

    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
    

Das war eine Menge zu verarbeiten, aber ich hoffe, dass Sie Ihre Medien jetzt zuverlässig verschlüsseln können. Als Nächstes zeigen wir Ihnen, wie Sie Ihrer Website Medien hinzufügen.