HLS.js使用ガイドとベストプラクティス
HLSストリーミング再生の核心技術を1記事で理解。動作原理、基本的なコード例、よく使う設定、イベントリスナー、エラー処理まで網羅。
続きを読む →安全な動画配信システムを構築し、コンテンツの著作権を保護
HLS(HTTP Live Streaming)は現在最も広く利用されているストリーミング配信プロトコルの1つです。有料動画、オンライン教育、企業研修などのシーンでは、コンテンツのセキュリティが非常に重要です。HLSは標準化された暗号化メカニズムを提供しており、動画コンテンツの不正なダウンロードや拡散を効果的に防止できます。
HLSの暗号化方式には主に2種類あります:AES-128による完全セグメント暗号化と、SAMPLE-AESによるサンプル暗号化です。それぞれに長所と短所があり、セキュリティ要件とパフォーマンス要件に応じて使い分けます。本記事では、この2つの暗号化方式の原理、実装手順、ベストプラクティスについて詳しく解説します。
HLS暗号化は共通鍵暗号方式に基づいており、メディアセグメントの送信前に暗号化を行い、プレーヤーが再生時にリアルタイムで復号します。このプロセスはユーザーには透過的ですが、コンテンツのセキュリティを効果的に保護します。
HLSではEXT-X-KEYタグを使用して暗号化方式と鍵のURLを指定します:
#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
AES-128はHLSで最も基本的で互換性の高い暗号化方式で、TSセグメント全体を暗号化します。
まず、16バイト(128ビット)のランダムな鍵を生成する必要があります:
# OpenSSLで鍵を生成
openssl rand -out key.key 16
# 鍵を確認(16進数)
hexdump -e '16/1 "%02x" "\n"' key.key
FFmpegを使用して暗号化されたHLSストリームを生成します:
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
key_info.txtファイルのフォーマットは以下の通りです:
https://example.com/keys/key.key
key.key
0123456789abcdef0123456789abcdef
1行目は鍵のURIアドレス、2行目はローカルの鍵ファイルパス、3行目はオプションのIV(初期化ベクトル)です。
SAMPLE-AESはAppleが提案した別のHLS暗号化方式で、メディアサンプルの一部のみを暗号化します。セキュリティを確保しつつ、パフォーマンスのオーバーヘッドを抑えられるのが特徴です。
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
鍵管理はHLS暗号化システムにおいて最も重要な要素です。鍵が漏洩してしまうと、暗号化の意味がなくなってしまいます。
定期的に鍵を変更することで、鍵漏洩のリスクを低減できます:
#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
Token付きのURLを使用して、鍵へのアクセス権限を制御します:
#EXT-X-KEY:METHOD=AES-128,URI="https://example.com/key?token=eyJhbGciOiJIUzI1NiJ9..."
鍵サーバーには以下の認証メカニズムを実装すべきです:
HLS暗号化を正常に動作させるためには、サーバーを適切に設定することが重要です。
location /keys/ {
alias /path/to/keys/;
# Token認証
if ($arg_token = "") {
return 403;
}
# 鍵のキャッシュを防止
add_header Cache-Control "no-store, no-cache, must-revalidate";
add_header Pragma "no-cache";
# CORS設定
add_header Access-Control-Allow-Origin "*";
}
プレーヤーがクロスドメインで鍵とセグメントを取得できるようにします:
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;
}
}
プレーヤーによってHLS暗号化への対応状況は異なります。
HLS.jsはWebで最も広く使われているHLSプレーヤーライブラリで、AES-128暗号化に対応しています:
const hls = new Hls({
// カスタムxhrリクエスト。認証ヘッダーの追加などに使用
xhrSetup: function(xhr, url) {
if (url.includes('.key')) {
xhr.setRequestHeader('Authorization', 'Bearer ' + token);
}
}
});
hls.loadSource('https://example.com/encrypted.m3u8');
hls.attachMedia(video);
M3U8ファイル、TSセグメント、鍵リクエストのすべてをHTTPSで送信し、中間者攻撃による鍵の盗難を防止してください。
固定の鍵ファイル名は使用せず、Token付きの動的なURLを使用して、再生ごとに異なる鍵リンクを生成してください。
鍵のTokenには適切な有効期限を設定してください。通常は動画の長さに一定のバッファ時間を加えたものを設定し、Tokenの長期的な悪用を防止します。
高価値コンテンツには、WidevineやFairPlayなどの専門的なDRMシステムとの併用を推奨します。より強力なコンテンツ保護を実現できます。
鍵リクエストのログを記録し、異常なリクエストパターンを監視して、不正なリンク共有行為を早期に発見・対応してください。
動画に電子透かしを埋め込むことで、コンテンツが録画された場合でも漏洩元を追跡できるようになります。
HLS暗号化は動画コンテンツのセキュリティを守るための重要な手段です。AES-128は互換性が最も高く、SAMPLE-AESはパフォーマンスに優れています。実際の運用では、セキュリティ要件、対象デバイス、パフォーマンス要件に応じて、適切な暗号化方式を選択する必要があります。
また、鍵管理は暗号化システム全体の中核を担うものであり、十分なユーザー認証・権限管理・セキュリティ戦略と組み合わせてこそ、真のコンテンツ保護を実現できます。
その他の役立つ記事とツール
HLSストリーミング再生の核心技術を1記事で理解。動作原理、基本的なコード例、よく使う設定、イベントリスナー、エラー処理まで網羅。
続きを読む →動画CDN高速化の原理と最適化手法を詳しく解説。キャッシュ戦略、帯域制御、エッジコンピューティング、プリキャッシュ、コスト最適化の提案まで。
続きを読む →モバイルでの動画再生最適化テクニックを総まとめ。自動再生の制限、ミュート戦略、ジェスチャー操作、画面の向き切り替え、パフォーマンス・バッテリー最適化まで解説。
続きを読む →