CGJU
查工具网
2026年5月12日 · 読了時間 7 分

HLS暗号化の概要

HLS(HTTP Live Streaming)は現在最も広く利用されているストリーミング配信プロトコルの1つです。有料動画、オンライン教育、企業研修などのシーンでは、コンテンツのセキュリティが非常に重要です。HLSは標準化された暗号化メカニズムを提供しており、動画コンテンツの不正なダウンロードや拡散を効果的に防止できます。

HLSの暗号化方式には主に2種類あります:AES-128による完全セグメント暗号化と、SAMPLE-AESによるサンプル暗号化です。それぞれに長所と短所があり、セキュリティ要件とパフォーマンス要件に応じて使い分けます。本記事では、この2つの暗号化方式の原理、実装手順、ベストプラクティスについて詳しく解説します。

HLS暗号化の原理

HLS暗号化は共通鍵暗号方式に基づいており、メディアセグメントの送信前に暗号化を行い、プレーヤーが再生時にリアルタイムで復号します。このプロセスはユーザーには透過的ですが、コンテンツのセキュリティを効果的に保護します。

暗号化の流れ

  1. 鍵の生成:暗号化鍵(Key)と初期化ベクトル(IV)を生成
  2. コンテンツの暗号化:鍵を使用してTSセグメントを暗号化
  3. プレイリストの更新:M3U8ファイルに暗号化情報タグを追加
  4. 鍵の配布:安全な経路で認証されたユーザーに鍵を提供
  5. 再生時の復号:プレーヤーが鍵を取得して復号・再生

M3U8暗号化タグ

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暗号化の実装

AES-128はHLSで最も基本的で互換性の高い暗号化方式で、TSセグメント全体を暗号化します。

暗号化鍵の生成

まず、16バイト(128ビット)のランダムな鍵を生成する必要があります:

# OpenSSLで鍵を生成
openssl rand -out key.key 16

# 鍵を確認(16進数)
hexdump -e '16/1 "%02x" "\n"' key.key

FFmpegでの暗号化コマンド

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暗号化

SAMPLE-AESはAppleが提案した別のHLS暗号化方式で、メディアサンプルの一部のみを暗号化します。セキュリティを確保しつつ、パフォーマンスのオーバーヘッドを抑えられるのが特徴です。

SAMPLE-AESの特徴

  • 部分暗号化:サンプル全体ではなく、各サンプルの先頭16バイトのみを暗号化
  • パフォーマンスに優れる:暗号化・復号の計算量が少なく、低性能デバイスに適している
  • Appleエコシステムとの親和性が高い:iOSやApple TVなどのデバイスでネイティブサポート
  • 十分なセキュリティ:ほとんどのシーンで、部分暗号化でもコンテンツ保護に十分

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

鍵管理戦略

鍵管理は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による鍵アクセス制御

Token付きのURLを使用して、鍵へのアクセス権限を制御します:

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

サーバー側での鍵認証

鍵サーバーには以下の認証メカニズムを実装すべきです:

  • ユーザー認証:ユーザーがログインしているか確認
  • コンテンツ権限確認:ユーザーがその動画を視聴する権限があるか確認
  • Tokenの有効期限:鍵URLに有効期限を設定
  • IPホワイトリスト:特定のIPからのみ鍵を取得できるよう制限
  • Refererチェック:鍵リンクが直接参照されるのを防止

サーバー設定

HLS暗号化を正常に動作させるためには、サーバーを適切に設定することが重要です。

Nginxでの鍵配信サーバー設定

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 "*";
}

CORS設定

プレーヤーがクロスドメインで鍵とセグメントを取得できるようにします:

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暗号化への対応状況は異なります。

ネイティブ対応

  • Safari (macOS/iOS):AES-128とSAMPLE-AESの両方にネイティブ対応
  • AVPlayer (iOS/tvOS):HLS暗号化を完全サポート
  • ExoPlayer (Android):AES-128暗号化に対応

HLS.jsでの対応

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);

セキュリティのベストプラクティス

1. HTTPSを使用する

M3U8ファイル、TSセグメント、鍵リクエストのすべてをHTTPSで送信し、中間者攻撃による鍵の盗難を防止してください。

2. 鍵URLを動的に生成する

固定の鍵ファイル名は使用せず、Token付きの動的なURLを使用して、再生ごとに異なる鍵リンクを生成してください。

3. 鍵に有効期限を設定する

鍵のTokenには適切な有効期限を設定してください。通常は動画の長さに一定のバッファ時間を加えたものを設定し、Tokenの長期的な悪用を防止します。

4. DRMシステムと組み合わせる

高価値コンテンツには、WidevineやFairPlayなどの専門的なDRMシステムとの併用を推奨します。より強力なコンテンツ保護を実現できます。

5. 鍵リクエストを監視する

鍵リクエストのログを記録し、異常なリクエストパターンを監視して、不正なリンク共有行為を早期に発見・対応してください。

6. ウォーターマーク技術との併用

動画に電子透かしを埋め込むことで、コンテンツが録画された場合でも漏洩元を追跡できるようになります。

まとめ

HLS暗号化は動画コンテンツのセキュリティを守るための重要な手段です。AES-128は互換性が最も高く、SAMPLE-AESはパフォーマンスに優れています。実際の運用では、セキュリティ要件、対象デバイス、パフォーマンス要件に応じて、適切な暗号化方式を選択する必要があります。

また、鍵管理は暗号化システム全体の中核を担うものであり、十分なユーザー認証・権限管理・セキュリティ戦略と組み合わせてこそ、真のコンテンツ保護を実現できます。

関連記事

その他の役立つ記事とツール

HLS再生をテストしたい方へ

当サイトの無料M3U8オンラインプレーヤーなら、暗号化HLSストリームの再生にも対応。ブラウザですぐにテストできます

今すぐ体験 ➡