Chiffrement multimédia

Derek Herman
Derek Herman
Joe Medley
Joe Medley

Dans cette section, nous allons aborder deux stratégies différentes de chiffrement de vos contenus multimédias, ainsi que des exemples pratiques sur leur utilisation avec FFmpeg et Shaka Packager. Les deux stratégies de chiffrement que nous allons évoquer sont Clear Key et l'utilisation d'un service tel que Google Widevine. Ces deux stratégies sont une forme de gestion des droits numériques (DRM) qui permet de contrôler les actions autorisées des utilisateurs sur vos contenus multimédias. 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 approprié.

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 modernes, vous utiliserez probablement les trois services DRM.

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

Chiffrement Clear Key

Tout d'abord, vous devez bien comprendre ce qu'est et n'est pas Clear Key avant de l'utiliser. Lorsque vous ne souhaitez pas utiliser un service DRM existant et que vous estimez qu'un chiffrement de base de vos contenus multimédias est une option viable, vous devez utiliser 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 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 licence. De plus, Clear Key envoie la paire clé-valeur en texte brut. Par conséquent, lorsque vous chiffrez vos contenus multimédias, la clé de déchiffrement 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 crée une clé de chiffrement composée de 16 valeurs hexadécimales.

openssl rand -hex 16 > media.key

Créer un IV

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

openssl rand -hex 16
6143b5373a51cb46209cfed0d747da66

Chiffrer avec une clé claire

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

Pour l'indicateur key, utilisez la clé créée précédemment, qui est stockée dans le fichier media.key. Toutefois, lorsque vous le saisissez dans la ligne de commande, assurez-vous d'avoir supprimé les espaces blancs. Pour l'indicateur key_id, répétez la valeur media.id ou utilisez la valeur IV 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 sur les clés

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

key URI
key file path
private key

L'URI de clé est l'emplacement de media.key (créé ci-dessus) sur votre serveur. Le chemin d'accès au fichier de clé est son emplacement par rapport au fichier d'informations sur les clés. Enfin, la clé privée correspond au contenu du fichier media.key lui-même ou à l'IV 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 une clé de 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 Clear Key et quand l'utiliser. Mais quand devez-vous utiliser un service DRM pour plus de sécurité ? C'est là que Widevine ou un autre service est utilisé pour chiffrer et déchiffrer de manière sécurisée vos contenus multimédias. Widevine est une DRM de Google compatible avec MPEG-DASH et HLS. Widevine est utilisé par les navigateurs Web Google Chrome et Firefox, Android MediaDRM, Android TV et d'autres appareils électroniques grand public qui utilisent des extensions multimédias chiffrées et des extensions de source multimédia, où Widevine déchiffre le contenu.

Chiffrer avec Widevine

La plupart des exemples de cet article ont utilisé le chiffrement Clear Key. Toutefois, pour Widevine, vous devez 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 figure dans la commande demultiplexeur (demux), à l'exception du nom de vos fichiers et de l'indicateur --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 plutôt que les vôtres. Pour obtenir d'autres exemples, consultez la documentation de Shaka Packager sur l'utilisation du Widevine Key Server.

  1. Démultiplexez (séparez) l'audio et la vidéo, chiffrez les nouveaux fichiers et génèrez un fichier de description de la présentation du mé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. Remuxez (combinez) 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 multimédia

Cette section présente les commandes nécessaires pour passer d'un fichier .mov brut à des éléments chiffrés empaquetés pour DASH ou HLS. Pour illustrer un objectif, nous convertissons un fichier source en débit de 8 Mbit/s à une résolution de 1080p (1 920 x 1 080). Ajustez ces valeurs en fonction de vos besoins.

DASH/WebM

  1. Convertissez le type de fichier et le codec.

    Pour cette commande, vous pouvez utiliser liborbis ou libopus comme 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 Clear Key.

    openssl rand -hex 16 > media.key
    
  3. Démultiplexez (séparez) l'audio et la vidéo, chiffrez les nouveaux fichiers et génèrez un fichier de description de la présentation du mé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. Remuxez (combinez) 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 Clear Key.

    openssl rand -hex 16 > media.key
    
  3. Démultiplexez (séparez) l'audio et la vidéo, chiffrez les nouveaux fichiers et génèrez un fichier de description de la présentation du mé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. Remuxez (combinez) 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 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 Clear Key.

    openssl rand -hex 16 > media.key
    
  3. Créer un fichier d'informations sur les 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
    

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