Chiffrement multimédia

Derek Herman
Derek Herman
Joe Medley
Joe Medley

Dans cette section, nous allons aborder deux stratégies différentes pour chiffrer vos contenus multimédias, et nous donner quelques exemples pratiques de leur utilisation avec FFmpeg et Shaka Packager. Nous allons aborder deux stratégies de chiffrement : Effacer la clé et utiliser un service tel que Google Widevine. Ces deux stratégies constituent une forme de gestion des droits numériques (DRM) permettant de contrôler ce que les utilisateurs peuvent faire avec votre contenu multimédia. Cependant, l'un est intrinsèquement moins sécurisé que l'autre en raison de la manière dont les clés sont transmises pour l'authentification. C'est pourquoi un service DRM peut être plus judicieux.

Les principaux services DRM pour le Web sont Google Widevine, Microsoft PlayReady et Apple FairPlay, mais nous ne les aborderons pas tous dans cet article. Toutefois, si vous ciblez tous les navigateurs récents, vous utiliserez probablement les trois services DRM.

La conversion et le chiffrement sont effectués avec les applications suivantes:

Effacer le chiffrement de la clé

Tout d'abord, vous devez bien comprendre ce qu'est la fonction Clear Key et ce qu'elle ne doit pas faire avant de l'utiliser. Si vous ne souhaitez pas utiliser un service DRM existant et que vous estimez que le chiffrement de base de votre contenu multimédia est une option viable, vous pouvez utiliser la fonction Clear Key. Gardez toutefois à l'esprit que ce type de chiffrement n'offre pas le même niveau de sécurité que l'utilisation de l'un des services DRM. En effet, la paire clé-valeur n'est pas chiffrée avec une autre clé, contrairement aux clés chiffrées qui sont générées par une clé de déchiffrement stockée sur un serveur de licences. De plus, la fonctionnalité Effacer la clé envoie la paire clé-valeur en texte brut. Ainsi, lorsque vous chiffrez votre contenu multimédia, la clé permettant de la déchiffrer n'est pas secrète.

Créer une clé

Vous pouvez utiliser la même méthode pour créer une clé pour DASH et HLS. Pour ce faire, utilisez OpenSSL. La commande suivante permet de créer une clé de chiffrement composée de 16 valeurs hexadécimales.

openssl rand -hex 16 > media.key

Créer un vecteur d'initialisation

Nous pouvons ensuite générer un vecteur d'initialisation (IV).

openssl rand -hex 16
6143b5373a51cb46209cfed0d747da66

Chiffrer avec une clé d'effacement

L'exemple suivant utilise Shaka Packager avec des clés brutes, où keys et key_ids sont fournis directement à Shaka Packager. Lisez la documentation pour découvrir d'autres exemples.

Pour l'option key, utilisez la clé créée précédemment, qui est stockée dans le fichier media.key. Toutefois, lorsque vous le saisissez sur la ligne de commande, assurez-vous d'avoir supprimé son espace blanc. Pour l'indicateur key_id, répétez la valeur media.id ou utilisez la valeur de vecteur d'initialisation générée ci-dessus.

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

Créer un fichier d'informations de clé

Pour chiffrer des données HLS, vous avez besoin d'un fichier d'informations de clé en plus du fichier de clé. Un fichier d'informations de clé est un fichier texte au format ci-dessous. Il doit porter l'extension .keyinfo. Exemple : encrypt.keyinfo.

key URI
key file path
private key

L'URI de la clé correspond à l'emplacement de la clé media.key (créée ci-dessus) sur votre serveur. Le chemin d'accès au fichier de clé correspond à son emplacement par rapport au fichier d'informations de clé. Enfin, la clé privée correspond au contenu du fichier media.key lui-même ou du vecteur d'initialisation que vous avez créé précédemment. Exemple :

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

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

Cette commande accepte une clé comportant 16 ou 32 caractères.

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

Chiffrement Widevine

Vous savez maintenant ce qu'est le chiffrement de la clé et quand l'utiliser. Mais quand faut-il utiliser un service DRM pour renforcer la sécurité ? C'est là que Widevine, ou un autre service, peut être utilisé pour chiffrer et déchiffrer vos contenus multimédias de manière sécurisée. Widevine est compatible avec MPEG-DASH et HLS, et est une DRM de Google. Widevine est utilisé par les navigateurs Web Google Chrome et Firefox, Android MediaDRM, Android TV et d'autres appareils électroniques grand public qui utilisent les API Encrypted Media Extensions et Media Source Extensions, où Widevine déchiffre le contenu.

Chiffrer avec Widevine

La plupart des exemples de cet article utilisaient le chiffrement "Effacer la clé". Toutefois, pour Widevine, vous devrez remplacer les options suivantes.

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

Tout ce qui se trouve dans la commande de démultiplexeur (demux), à l'exception du nom de vos fichiers et de l'indicateur --content-id, doit être copié exactement à partir de l'exemple. La valeur --content-id est composée de 16 ou 32 chiffres hexadécimaux aléatoires. Utilisez les clés fournies ici plutôt que les vôtres. Consultez la documentation de Shaka Packager sur l'utilisation du serveur de clés Widevine pour obtenir d'autres exemples.

  1. Démux (séparer) l'audio et la vidéo, chiffrer les nouveaux fichiers et générer un fichier MPD (Mediapresentation Description)

    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 (combine) les flux audio et vidéo. Si vous utilisez un framework vidéo, vous n'aurez peut-être pas besoin de le faire.

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

Séquence de conversion média

Cette section présente les commandes d'ordre nécessaires pour passer d'un fichier .mov brut aux éléments chiffrés empaquetés pour DASH ou HLS. Pour illustrer notre propos, nous convertissons un fichier source à un débit de 8 Mo et une résolution de 1 080p (1 920 x 1 080). Ajustez ces valeurs selon vos besoins.

DASH/WebM

  1. Convertissez le type de fichier et le codec.

    Pour cette commande, vous pouvez utiliser liborbis ou libopus pour le codec audio.

    ffmpeg -i glocken.mov -c:v libvpx-vp9 -c:a libvorbis -b:v 8M -vf setsar=1:1 -f webm tmp_glocken.webm
    
  2. Créez une clé de chiffrement de suppression de clé.

    openssl rand -hex 16 > media.key
    
  3. Démux (séparer) l'audio et la vidéo, chiffrer les nouveaux fichiers et générer un fichier MPD (Mediapresentation Description)

    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 (combine) les flux audio et vidéo. Si vous utilisez un framework vidéo, vous n'aurez peut-être pas besoin de le faire.

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

DASH/MP4

  1. Convertissez le type de fichier, le codec vidéo et le débit.

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 tmp_glocken.mp4
    
  2. Créez une clé de chiffrement de suppression de clé.

    openssl rand -hex 16 > media.key
    
  3. Démux (séparer) l'audio et la vidéo, chiffrer les nouveaux fichiers et générer un fichier MPD (Mediapresentation Description)

    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 (combine) les flux audio et vidéo. Si vous utilisez un framework vidéo, vous n'aurez peut-être pas besoin de le faire.

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

HLS/MP4

Le HLS n'est compatible qu'avec le format MP4. Vous devez donc d'abord effectuer la conversion vers le conteneur MP4 et les codecs compatibles.

  1. Convertissez le type de fichier, le codec vidéo et le débit.

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 glocken.mp4
    
  2. Créez une clé de chiffrement de suppression de clé.

    openssl rand -hex 16 > media.key
    
  3. Créer un fichier d'informations de clé

    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
    

C'était beaucoup à assimiler, mais j'espère que vous pouvez désormais chiffrer vos contenus multimédias en toute confiance. Nous allons maintenant vous montrer comment ajouter des fichiers multimédias à votre site.