Chiffrement multimédia

Derek Herman
Derek Herman
Joe Medley
Joe Medley

Dans cette section, nous allons aborder deux stratégies de chiffrement différentes vos supports multimédias, et quelques exemples pratiques de leur utilisation avec FFmpeg et Shaka Packager. Les deux stratégies de chiffrement dont nous allons parler sont Effacer la clé et à l'aide d'un service comme Google Widevine. Ces deux stratégies sont une forme de stratégie gestion des droits (DRM) afin de contrôler ce que les utilisateurs peuvent faire avec vos contenus multimédias. Toutefois, l'une est intrinsèquement moins sécurisée que l'autre en raison de la façon dont les clés sont transmises pour l'authentification et c'est pourquoi un service DRM pourrait être plus judicieux.

Les principaux services DRM pour le Web sont Google Widevine et Microsoft PlayReady et Apple FairPlay, mais nous ne les aborderons pas toutes dans cet article. En revanche, si vous ciblez tous les navigateurs récents, d'utiliser 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 savoir ce qu'est la touche claire et ce qu'elle ne l'est pas avant l'utilisent. Lorsque vous ne souhaitez pas utiliser un service DRM existant et estimez le cryptage de base de votre contenu multimédia est une option viable, vous pouvez utiliser Clear Key. 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 non chiffrées sous une autre clé, contrairement aux clés chiffrées qui sont générées de déchiffrement stockée sur un serveur de licences. En outre, l'option "Effacer la clé" envoie la paire clé-valeur sous forme de texte brut. Ainsi, pendant que vous chiffrez votre média, déchiffrer ce n'est pas un secret.

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 Les key_ids sont fournis directement à Shaka Packager. Lisez la documentation pour d'autres exemples.

Pour l'option key, utilisez la clé créée précédemment et stockée dans le media.key. . Toutefois, lorsque vous le saisissez dans la ligne de commande, assurez-vous de l'avoir supprimé d'espace. Pour l'option key_id, répétez la valeur media.id ou utilisez la valeur IV. généré 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 la clé

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

key URI
key file path
private key

L'URI de la clé correspond à l'emplacement où media.key (créé ci-dessus sera sur votre serveur. Le chemin d'accès au fichier de clé correspond à son emplacement par rapport à la clé fichier d'informations. Enfin, la clé privée correspond au contenu de media.key. lui-même, ou le 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 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 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, sera utilisé pour chiffrer et déchiffrer de manière sécurisée votre contenu multimédia. Widevine prend en charge MPEG-DASH et HLS. Il s'agit d'une DRM de Google. Widevine est utilisé par les navigateurs Web Google Chrome et Firefox les navigateurs, Android MediaDRM, Android TV et les autres appareils électroniques grand public qui utilisent Encrypted Media Extensions et Media Source Extensions, qui permettent à Widevine de déchiffrer du contenu.

Chiffrer avec Widevine

La plupart des exemples de cet article utilisaient le chiffrement de clé claire. Cependant, pour Widevine, doit 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 L'option --content-id doit être copiée exactement à partir de l'exemple. --content-id a 16 ans soit 32 chiffres hexadécimaux aléatoires. Utilisez les clés fournies ici à la place des vôtres. Lisez le shaka Documentation de l'empaqueteur sur l'utilisation du serveur de clés Widevine pour plus d'exemples.

  1. Démux (séparer) l'audio et la vidéo, chiffrer les nouveaux fichiers et générer description de la 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 une 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 l'ordre des commandes nécessaires pour passer d'un fichier .mov brut à les éléments chiffrés empaquetés pour DASH ou HLS. Dans le but d'avoir un objectif nous convertissons un fichier source à un débit de 8 Mbit/s avec une résolution 1080p (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éparer) l'audio et la vidéo, chiffrer les nouveaux fichiers et générer description de la 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 une 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éparer) l'audio et la vidéo, chiffrer les nouveaux fichiers et générer description de la 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 une 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 fichier en conteneur MP4, 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 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 été beaucoup à assimiler, mais j'espère que vous pourrez maintenant chiffrer vos contenus multimédias en toute confiance. Nous allons maintenant vous montrer comment ajouter des contenus multimédias à sur votre site.