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, ainsi que quelques exemples pratiques de leur utilisation avec FFmpeg et Shaka Packager. Les deux stratégies de chiffrement dont nous allons parler sont l'effacement de la clé et l'utilisation d'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 vos contenus multimédias. Cependant, l'une est intrinsèquement moins sécurisée 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 s'avérer 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 à l'aide des applications suivantes:

Effacer le chiffrement de la clé

Tout d'abord, vous devez bien comprendre ce qu'est la clé claire et ce qu'elle ne l'est pas 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, utilisez l'option "Effacer la clé". Toutefois, gardez à 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 sous 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, Clear Key envoie la paire clé-valeur en texte brut. Par conséquent, 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 afin de 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 et qui est stockée dans le fichier media.key. Toutefois, lorsque vous le saisissez dans la ligne de commande, assurez-vous d'avoir supprimé son espace blanc. Pour l'option 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 clés

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

key URI
key file path
private key

L'URI de la clé correspond à l'emplacement du media.key (créé ci-dessus) sur votre serveur. Le chemin d'accès au fichier de clé correspond à son emplacement par rapport au fichier d'informations de la 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

Chiffrer 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 les clés 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 clé claire et quand l'utiliser. Mais dans quels cas utiliser un service DRM pour renforcer la sécurité ? C'est là que Widevine, ou un autre service, serait utilisé pour chiffrer et déchiffrer vos contenus multimédias de manière sécurisée. Widevine est compatible avec MPEG-DASH et HLS. Il s'agit d'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 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 de clé claire. 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'option --content-id, doit être copié exactement à partir de l'exemple. --content-id est composé de 16 ou 32 chiffres hexadécimaux aléatoires. Utilisez les clés fournies ici à la place des vôtres. Lisez la documentation de Shaka Packager sur l'utilisation du serveur de clés Widevine pour découvrir d'autres exemples.

  1. Démux (séparez) l'audio et la vidéo, chiffrez les nouveaux fichiers et générez un fichier de description de présentation multimédia (MPD).

    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 de média

Cette section présente dans l'ordre les commandes nécessaires pour passer d'un fichier .mov brut à des éléments chiffrés empaquetés pour DASH ou HLS. À des fins d'illustration, nous convertissons un fichier source à un débit de 8 Mo à 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 clé claire.

    openssl rand -hex 16 > media.key
    
  3. Démux (séparez) l'audio et la vidéo, chiffrez les nouveaux fichiers et générez un fichier de description de présentation multimédia (MPD).

    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 clé claire.

    openssl rand -hex 16 > media.key
    
  3. Démux (séparez) l'audio et la vidéo, chiffrez les nouveaux fichiers et générez un fichier de description de présentation multimédia (MPD).

    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

HLS n'est compatible qu'avec le format MP4. Vous devez donc d'abord convertir le conteneur MP4 en 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 clé claire.

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

    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
    

Cela a demandé beaucoup de travail, mais nous espérons que vous pourrez maintenant chiffrer vos contenus multimédias en toute confiance. Nous allons maintenant vous montrer comment ajouter des éléments multimédias à votre site.