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. Wir besprechen die beiden Verschlüsselungsstrategien Clear Key und die Verwendung eines Dienstes wie Google Widevine. Beide Strategien sind eine Form der digitalen Rechteverwaltung (DRM), mit der du festlegen kannst, was Nutzer mit deinen Medien tun dürfen. Aufgrund der Art und Weise, wie Schlüssel für die Authentifizierung übergeben werden, ist eine Methode jedoch von Natur aus weniger sicher als die andere. Daher ist ein DRM-Dienst möglicherweise sinnvoller.
Die wichtigsten DRM-Dienste für das Web sind Google Widevine, Microsoft PlayReady und Apple FairPlay. In diesem Artikel werden jedoch nicht alle behandelt. 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:
Verschlüsselung mit Klartextschlüssel
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, wenn 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 muss 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 die IV, die Sie zuvor erstellt haben. 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), mit Ausnahme des Namens deiner 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. Weitere Beispiele findest du in der Dokumentation zum Widevine Key Server.
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"
Audio- und Videostreams zusammenführen (Remuxing). Wenn Sie ein Video-Framework verwenden, ist das möglicherweise nicht erforderlich.
ffmpeg -i glocken_video.mp4 -i glocken_audio.m4a -c copy glocke.mp4
Medienkonvertierungssequenz
In diesem Abschnitt werden die Befehle in der richtigen Reihenfolge aufgeführt, die erforderlich sind, um von einer Rohdatei vom Typ .mov
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
Konvertieren Sie den Dateityp und den Codec.
Für diesen Befehl kannst du entweder
liborbis
oderlibopus
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
Erstellen Sie einen Verschlüsselungsschlüssel für den Klartextschlüssel.
openssl rand -hex 16 > media.key
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
Audio- und Videostreams zusammenführen (Remuxing). 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
Konvertieren Sie den Dateityp, den Videocodec und die Bitrate.
ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 tmp_glocken.mp4
Erstellen Sie einen Verschlüsselungsschlüssel für den Klartextschlüssel.
openssl rand -hex 16 > media.key
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
Audio- und Videostreams zusammenführen (Remuxing). 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.
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
Erstellen Sie einen Verschlüsselungsschlüssel für den Klartextschlüssel.
openssl rand -hex 16 > media.key
Datei mit wichtigen Informationen 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.