Medienverschlüsselung

Derek Herman
Derek Herman
Joe Medley
Joe Medley

In diesem Abschnitt geht es um zwei verschiedene Strategien zum Verschlüsseln von Medien sowie um einige praktische Beispiele für deren Verwendung mit FFmpeg und Shaka Packager. Wir besprechen die beiden Verschlüsselungsstrategien, die wir besprechen werden, Clear Key und die Verwendung eines Dienstes wie Google Widevine. Beide Strategien sind eine Form der digitalen Rechteverwaltung (Digital Rights Management, DRM), mit der sich steuern lässt, was Nutzer mit Ihren Medien tun dürfen. Ein DRM-Dienst ist jedoch an sich weniger sicher als der andere, da die Schlüssel zur Authentifizierung so weitergegeben werden, dass ein DRM-Dienst sinnvoller sein kann.

Die primären Dienste zur digitalen Rechteverwaltung im Web sind Google Widevine, Microsoft PlayReady und Apple FairPlay. In diesem Artikel werden wir sie jedoch nicht auf alle behandeln. Wenn Ihre Anzeigen jedoch auf alle modernen Browser ausgerichtet sind, werden Sie wahrscheinlich alle drei Dienste für die digitale Rechteverwaltung nutzen.

Die Konvertierung und Verschlüsselung erfolgt mit den folgenden Anwendungen:

Schlüsselverschlüsselung löschen

Zuerst sollten Sie wissen, was ein Löschschlüssel ist und was nicht, bevor Sie ihn verwenden. Wenn Sie keinen vorhandenen DRM-Dienst verwenden möchten und der Meinung sind, dass die grundlegende Verschlüsselung Ihrer Medien eine praktikable Option ist, verwenden Sie die Funktion „Schlüssel löschen“. Beachten Sie jedoch, dass diese Art der Verschlüsselung nicht dasselbe Maß an Sicherheit bietet wie die Verwendung eines der DRM-Dienste. Dies liegt daran, dass das Schlüssel/Wert-Paar nicht unter einem anderen Schlüssel verschlüsselt wird, im Gegensatz zu verschlüsselten Schlüsseln, die von einem Entschlüsselungsschlüssel generiert werden, der auf einem Lizenzserver gespeichert ist. Darüber hinaus sendet die Funktion „Clear Key“ das Schlüssel/Wert-Paar als Nur-Text. Das heißt, während Sie Ihr Medium verschlüsseln, ist der Schlüssel zum Entschlüsseln kein Geheimnis.

Schlüssel erstellen

Sie können mit derselben Methode einen Schlüssel für DASH und HLS erstellen. Dazu verwenden Sie 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 „Clear Key“ verschlüsseln

Im folgenden Beispiel wird Shaka Packager mit Rohschlüsseln verwendet. Dabei werden keys und key_ids direkt für Shaka Packager bereitgestellt. 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 jedoch bei der Eingabe in die Befehlszeile darauf, dass Sie den Leerraum entfernt haben. 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

Für die Verschlüsselung für HLS benötigst du zusätzlich zu einer Schlüsseldatei eine Datei mit Schlüsselinformationen. 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 die media.key (oben erstellt) auf Ihrem Server. Der Pfad der Schlüsseldatei ist der Speicherort in der Datei mit den Schlüsselinformationen. Schließlich ist der private Schlüssel der Inhalt der media.key-Datei selbst oder der zuvor erstellte 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 Clear-Key-Verschlüsselung ist und wann sie verwendet wird. Aber wann sollten Sie einen Dienst zur digitalen Rechteverwaltung nutzen, um die Sicherheit zu erhöhen? 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 eine digitale Rechteverwaltung 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 Media Source Extensions nutzen, wo Widevine Inhalte entschlüsselt.

Mit Widevine verschlüsseln

Bei den meisten Beispielen in diesem Artikel wurde die Clear-Key-Verschlüsselung verwendet. Für Widevine müssen Sie 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) mit Ausnahme des Namens der Dateien und des Flags --content-id sollte 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-Schlüsselservers.

  1. Demux (getrennt) die Audio- und Videoinhalte, verschlüsseln Sie 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. Die Audio- und Videostreams neu mux (kombinieren) Wenn Sie ein Video-Framework verwenden, müssen Sie das möglicherweise nicht tun.

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

Media-Conversion-Sequenz

In diesem Abschnitt werden die Befehle aufgelistet, die erforderlich sind, um von einer RAW-.mov-Datei in verschlüsselte Assets zu gelangen, die für DASH oder HLS verpackt wurden. Zur Veranschaulichung wandeln wir eine Quelldatei in eine Bitrate von 8 MB/s bei einer Auflösung von 1080p (1920 x 1080) um. Passen Sie diese Werte nach Bedarf an.

DASH/WebM

  1. Konvertieren Sie den Dateityp und den Codec.

    Für diesen Befehl kannst du entweder liborbis oder libopus als Audio-Codec 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 Clear-Key-Verschlüsselungsschlüssel.

    openssl rand -hex 16 > media.key
    
  3. Demux (getrennt) die Audio- und Videoinhalte, verschlüsseln Sie 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. Die Audio- und Videostreams neu mux (kombinieren) Wenn Sie ein Video-Framework verwenden, müssen Sie das möglicherweise nicht tun.

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

DASH/MP4

  1. Konvertiere Dateityp, Video-Codec und Bitrate.

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

    openssl rand -hex 16 > media.key
    
  3. Demux (getrennt) die Audio- und Videoinhalte, verschlüsseln Sie 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. Die Audio- und Videostreams neu mux (kombinieren) Wenn Sie ein Video-Framework verwenden, müssen Sie das möglicherweise nicht tun.

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

HLS/MP4

HLS unterstützt nur MP4. Daher musst du zuerst in den MP4-Container und unterstützte 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 Clear-Key-Verschlü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 sehr aufwendig, aber hoffentlich können Sie Ihre Medien jetzt zuverlässig verschlüsseln. Als Nächstes zeigen wir dir, wie du deiner Website Medien hinzufügst.