Medienverschlüsselung

Derek Herman
Derek Herman
Joe Medley
Joe Medley

In diesem Abschnitt werden zwei verschiedene Strategien zur Verschlüsselung deiner Medien und einige praktische Beispiele für die Verwendung mit FFmpeg und Shaka Packager beschrieben. 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 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 du jedoch alle modernen Browser anvisierst, wirst du wahrscheinlich alle drei DRM-Dienste verwenden.

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

Schlüsselverschlüsselung löschen

Bevor Sie Clear Key verwenden, sollten Sie ein gutes Verständnis dafür haben, was es ist und was nicht. Wenn du keinen vorhandenen DRM-Dienst verwenden möchtest und eine grundlegende Verschlüsselung deiner Medien für dich eine praktikable Option ist, solltest du Clear Key verwenden. Beachte aber, 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 nicht mit einem anderen Schlüssel verschlüsselt wird, im Gegensatz zu verschlüsselten Schlüsseln, die mit einem Entschlüsselungsschlüssel generiert werden, der auf einem Lizenzserver gespeichert ist. Außerdem sendet Clear Key das Schlüssel/Wert-Paar als Klartext. Wenn Sie also Ihre Medien verschlüsseln, ist der Schlüssel zur Entschlüsselung kein Geheimnis.

Schlüssel erstellen

Mit derselben Methode kannst du einen Schlüssel sowohl für DASH als auch für HLS erstellen. Verwenden Sie dazu OpenSSL. Im Folgenden wird ein Verschlüsselungsschlüssel mit 16 Hexadezimalziffern 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 Klartextschlüssel verschlüsseln

Im folgenden Beispiel wird Shaka Packager mit Rohschlüsseln verwendet, wobei keys und key_ids direkt an Shaka Packager übergeben 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. Entfernen Sie jedoch alle Leerzeichen, bevor Sie den Befehl in die Befehlszeile eingeben. 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 wichtigen Informationen 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 wichtigen Informationen ist eine Textdatei mit dem folgenden Format. Sie sollte die Erweiterung .keyinfo haben. Beispiel: encrypt.keyinfo

key URI
key file path
private key

Der Schlüssel-URI ist der Speicherort von media.key (oben erstellt) auf Ihrem Server. Der Pfad der Schlüsseldatei ist ihr Speicherort relativ zur Datei mit den Schlüsselinformationen. Der private Schlüssel ist schließlich der Inhalt der Datei media.key selbst oder der von Ihnen 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/"

Mit diesem Befehl wird ein Schlüssel mit 16 oder 32 Zeichen akzeptiert.

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 werden sollte. Aber wann sollten Sie einen DRM-Dienst für zusätzliche Sicherheit verwenden? Hier wird Widevine oder ein anderer Dienst verwendet, um Ihre Medien sicher zu verschlüsseln und zu entschlüsseln. Widevine ist ein DRM von Google, das MPEG-DASH und HLS unterstützt. Widevine wird von den Webbrowsern Google Chrome und Firefox, Android MediaDRM, Android TV und anderen Unterhaltungselektronikgeräten verwendet, die Encrypted Media Extensions und Media Source Extensions nutzen. Dabei werden Inhalte von Widevine entschlüsselt.

Mit Widevine verschlüsseln

In den meisten Beispielen in diesem Artikel wurde die Verschlüsselung mit Klartextschlüssel verwendet. Bei Widevine solltest du 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 findest du in der Dokumentation zum Widevine Key Server.

  1. Audio und Video demuxen (trennen), die neuen Dateien verschlüsseln und eine MPD-Datei (Media Presentation Description) ausgeben.

    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. Audio- und Videostreams remuxen (kombinieren). 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. Zur Veranschaulichung konvertieren wir eine Quelldatei mit einer Bitrate von 8 Mbit/s bei einer Auflösung von 1080p (1920 × 1080). Passen Sie diese Werte nach Bedarf an.

DASH/WebM

  1. Konvertiere den Dateityp und den Codec.

    Für diesen Befehl kannst du entweder liborbis oder libopus für den Audiocodec 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. Audio und Video demuxen (trennen), die neuen Dateien verschlüsseln und eine MPD-Datei (Media Presentation Description) ausgeben.

    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 das 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. Audio und Video demuxen (trennen), die neuen Dateien verschlüsseln und eine MPD-Datei (Media Presentation Description) ausgeben.

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

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

HLS/MP4

HLS unterstützt nur MP4. Du musst die Datei also zuerst in den MP4-Container und in unterstützte Codecs konvertieren.

  1. Konvertieren Sie den Dateityp, den Videocodec und die Bitrate.

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 glocken.mp4
    
  2. Erstellen Sie einen Verschlüsselungsschlüssel für den Klartextschlü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 an Informationen, aber hoffentlich können Sie Ihre Medien jetzt mit Zuversicht verschlüsseln. Als Nächstes zeigen wir Ihnen, wie Sie Medien auf Ihrer Website einfügen.