CGJU
CGJU
12 mai 2026 · Temps de lecture 7 minutes

Présentation du chiffrement HLS

HLS (HTTP Live Streaming) est l'un des protocoles de streaming les plus utilisés aujourd'hui. Dans les scénarios de vidéo payante, d'éducation en ligne, de formation en entreprise, etc., la sécurité du contenu est cruciale. HLS propose un mécanisme de chiffrement standardisé, qui peut empêcher efficacement le téléchargement et la diffusion illicites du contenu vidéo.

Le chiffrement HLS dispose principalement de deux solutions : le chiffrement complet des segments AES-128 et le chiffrement par échantillon SAMPLE-AES. Les deux solutions ont leurs avantages et inconvénients, et s'adaptent à différents besoins de sécurité et exigences de performance. Cet article présente en détail le principe, les étapes d'implémentation et les bonnes pratiques de ces deux méthodes de chiffrement.

Principe du chiffrement HLS

Le chiffrement HLS est basé sur un algorithme de chiffrement symétrique. Les segments média sont chiffrés avant leur transmission, et le lecteur les déchiffre en temps réel pendant la lecture. L'ensemble du processus est transparent pour l'utilisateur, mais protège efficacement la sécurité du contenu.

Processus de chiffrement

  1. Génération de la clé : Générer la clé de chiffrement (Key) et le vecteur d'initialisation (IV)
  2. Chiffrement du contenu : Chiffrer les segments TS à l'aide de la clé
  3. Mise à jour de la playlist : Ajouter des balises d'informations de chiffrement dans le fichier M3U8
  4. Distribution de la clé : Fournir la clé aux utilisateurs autorisés via un canal sécurisé
  5. Déchiffrement de lecture : Le lecteur obtient la clé puis déchiffre et lit le contenu

Balise de chiffrement M3U8

HLS spécifie la méthode de chiffrement et l'adresse de la clé via la balise EXT-X-KEY :

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="https://example.com/key.key",IV=0x00000000000000000000000000000000
#EXTINF:10.0,
segment00000.ts
#EXTINF:10.0,
segment00001.ts
#EXT-X-ENDLIST

Implémentation du chiffrement AES-128

AES-128 est la méthode de chiffrement HLS la plus basique et la mieux compatible. Elle chiffre l'intégralité du segment TS.

Générer la clé de chiffrement

Tout d'abord, générer une clé aléatoire de 16 octets (128 bits) :

# Générer une clé avec OpenSSL
openssl rand -out key.key 16

# Afficher la clé (hexadécimal)
hexdump -e '16/1 "%02x" "\n"' key.key

Commande de chiffrement FFmpeg

Utiliser FFmpeg pour générer un flux HLS chiffré :

ffmpeg -i input.mp4 \
  -c:v libx264 -c:a aac \
  -hls_time 10 \
  -hls_key_info_file key_info.txt \
  -hls_playlist_type vod \
  -hls_segment_filename "segment%05d.ts" \
  output.m3u8

Créer le fichier d'informations de clé

Le format du fichier key_info.txt est le suivant :

https://example.com/keys/key.key
key.key
0123456789abcdef0123456789abcdef

La première ligne est l'URI de la clé, la deuxième ligne est le chemin du fichier de clé local, la troisième ligne est l'IV (vecteur d'initialisation) optionnel.

Chiffrement SAMPLE-AES

SAMPLE-AES est une autre méthode de chiffrement HLS proposée par Apple. Elle ne chiffre qu'une partie des échantillons média, réduisant les coûts de performance tout en garantissant la sécurité.

Caractéristiques de SAMPLE-AES

  • Chiffrement partiel : Ne chiffre que les 16 premiers octets de chaque échantillon, pas le segment entier
  • Meilleure performance : La charge de calcul de chiffrement/déchiffrement est moindre, adaptée aux appareils moins performants
  • Bonne prise en charge de l'écosystème Apple : Pris en charge nativement sur iOS, Apple TV, etc.
  • Sécurité suffisante : Pour la plupart des scénarios, le chiffrement partiel suffit à protéger le contenu

Chiffrement FFmpeg SAMPLE-AES

ffmpeg -i input.mp4 \
  -c:v libx264 -c:a aac \
  -hls_time 10 \
  -hls_key_info_file key_info.txt \
  -hls_encryption_method sample-aes \
  -hls_playlist_type vod \
  output.m3u8

Stratégies de gestion des clés

La gestion des clés est l'élément le plus critique d'un système de chiffrement HLS. Si la clé est divulguée, le chiffrement perd sa raison d'être.

Rotation des clés

Changer régulièrement la clé permet de réduire le risque de divulgation :

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="https://example.com/key1.key"
#EXTINF:10.0,
segment00000.ts
#EXTINF:10.0,
segment00001.ts
#EXT-X-KEY:METHOD=AES-128,URI="https://example.com/key2.key"
#EXTINF:10.0,
segment00002.ts
#EXT-X-ENDLIST

Accès à la clé basé sur Token

Contrôler les droits d'accès à la clé via une URL avec Token :

#EXT-X-KEY:METHOD=AES-128,URI="https://example.com/key?token=eyJhbGciOiJIUzI1NiJ9..."

Vérification de la clé côté serveur

Le serveur de clés doit implémenter les mécanismes de vérification suivants :

  • Vérification de l'identité utilisateur : Vérifier si l'utilisateur est connecté
  • Vérification de l'autorisation sur le contenu : Vérifier si l'utilisateur a le droit de regarder cette vidéo
  • Validité du Token : Définir une date d'expiration pour l'URL de la clé
  • Liste blanche IP : Limiter la récupération de la clé aux IP spécifiées
  • Vérification Referer : Empêcher le lien de clé d'être référencé directement

Configuration serveur

Une configuration serveur correcte est essentielle au bon fonctionnement du chiffrement HLS.

Configuration du service de clés Nginx

location /keys/ {
    alias /path/to/keys/;
    # Vérifier le Token
    if ($arg_token = "") {
        return 403;
    }
    # Empêcher la mise en cache de la clé
    add_header Cache-Control "no-store, no-cache, must-revalidate";
    add_header Pragma "no-cache";
    # Configuration CORS
    add_header Access-Control-Allow-Origin "*";
}

Configuration CORS

S'assurer que le lecteur peut récupérer les clés et les segments cross-domaine :

location /hls/ {
    add_header Access-Control-Allow-Origin "*";
    add_header Access-Control-Allow-Methods "GET, HEAD";
    add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
    types {
        application/vnd.apple.mpegurl m3u8;
        video/mp2t ts;
    }
}

Prise en charge des lecteurs

Différents lecteurs ont des niveaux de prise en charge variables du chiffrement HLS.

Prise en charge native

  • Safari (macOS/iOS) : Prend en charge nativement AES-128 et SAMPLE-AES
  • AVPlayer (iOS/tvOS) : Prise en charge complète du chiffrement HLS
  • ExoPlayer (Android) : Prend en charge le chiffrement AES-128

Prise en charge HLS.js

HLS.js est la bibliothèque de lecteur HLS la plus utilisée sur le web, elle prend en charge le chiffrement AES-128 :

const hls = new Hls({
    // Requête xhr personnalisée, peut servir à ajouter des en-têtes d'authentification
    xhrSetup: function(xhr, url) {
        if (url.includes('.key')) {
            xhr.setRequestHeader('Authorization', 'Bearer ' + token);
        }
    }
});
hls.loadSource('https://example.com/encrypted.m3u8');
hls.attachMedia(video);

Bonnes pratiques de sécurité

1. Utiliser HTTPS

Toutes les requêtes de fichiers M3U8, de segments TS et de clés doivent être transmises via HTTPS pour empêcher les attaques de type homme du milieu de voler la clé.

2. Dynamisation de l'URL de la clé

Ne pas utiliser de nom de fichier de clé fixe. Utiliser des URL avec Token générées dynamiquement, générant un lien de clé différent à chaque lecture.

3. Définir une durée de validité de la clé

Le Token de clé doit avoir une durée de validité raisonnable, généralement définie comme la durée de la vidéo plus un temps de tampon, pour empêcher l'abus à long terme du Token.

4. Combiner avec un système DRM

Pour le contenu à haute valeur ajoutée, il est recommandé de combiner avec des systèmes DRM professionnels tels que Widevine, FairPlay, pour offrir une protection du contenu plus renforcée.

5. Surveiller les requêtes de clés

Enregistrer les journaux des requêtes de clés, surveiller les schémas de requêtes anormales, détecter et contrer rapidement les comportements de vol de lien.

6. Combiner avec la technique du tatouage numérique

Intégrer un tatouage numérique dans la vidéo. Même si le contenu est enregistré, on peut toujours retracer l'origine de la fuite.

Conclusion

Le chiffrement HLS est un moyen important de protéger la sécurité du contenu vidéo. AES-128 offre la meilleure compatibilité, tandis que SAMPLE-AES offre de meilleures performances. Dans les applications pratiques, il faut choisir la solution de chiffrement adaptée en fonction des besoins de sécurité spécifiques, des terminaux et des exigences de performance.

Parallèlement, la gestion des clés est au cœur de l'ensemble du système de chiffrement. Elle doit être associée à des mécanismes d'authentification, d'autorisation et des stratégies de sécurité complets pour atteindre véritablement l'objectif de protection du contenu.

Recommandations

Plus d'articles et d'outils pratiques

Vous voulez tester la lecture HLS ?

Utilisez notre lecteur M3U8 en ligne gratuit, prend en charge la lecture de flux HLS chiffrés, testez directement dans le navigateur

Essayer maintenant ➡