暗号化動画ストリーミング — マルチキーAES-128 HLS解説

AVCaptionの暗号化動画ストリーミング

AVCaptionにアップロードされた動画はすべて、CDNエッジに到達する前に暗号化されます。再生時の復号はブラウザのWeb Crypto APIによりクライアント側で行われ、鍵はあなたのドメインに紐付く短命の署名付きURLで配信されます。

このページでは各ステップで実際に起きていることを順に説明します。

暗号化パイプライン

AVCaptionに動画をアップロードすると:

  1. GPUエンコード — ソースファイルをNVIDIA NVENCで HLSアダプティブビットレート のバリアント(360p、540p、720p、1080p、4K)にエンコードします。
  2. セグメント分割 — 各バリアントを通常6秒ごとのHLSセグメントに切り分けます。
  3. バッチ暗号化 — セグメントを10個のバッチ(60秒の再生)にまとめます。各バッチには新しく生成された AES-128鍵 が割り当てられます。
  4. CDNアップロード — 暗号化済みセグメントはCloudflare R2にアップロードされ、グローバルCF CDN経由で強力なキャッシュとともに配信されます。
  5. キーボールト — 暗号鍵は別場所に保管され、CDNにもセグメントとも一緒に置かれません。

視聴者がplayを押すと:

  1. トークン要求 — プレーヤーが /api/stream/{embed_token}/token から再生トークンを要求します。サーバーはembedトークン、要求元ドメイン(ホワイトリスト照合)、レート制限を検証します。
  2. マスタープレイリスト — プレーヤーがHLSマスター .m3u8 を取得し、帯域に基づいてバリアントを選択します。
  3. バッチごとの鍵取得 — プレーヤーは必要な各セグメントバッチの鍵を /api/stream/{embed_token}/key/{batch} から要求します。各鍵URLは再生トークンで署名され、そのセッションでのみ有効です。
  4. クライアント側復号 — ブラウザのWeb Crypto APIがセグメントをメモリ内で復号し、video要素に渡します。鍵はディスクに保存されません。

マルチキーが重要な理由

シングルキー暗号化(多くのプラットフォームが採用するシンプルな方式)では、動画1本=鍵1本=URL1本です。そのURLが漏れれば、動画全体が永久に復号可能になります。

バッチごとのマルチキー暗号化では、動画1本=多数の鍵=多数の短命URLです。1つのURLが漏れても露出するのはそのバッチ(約60秒の映像)だけ。次のバッチは新しい鍵要求が必要で、流出者は新鮮な再生トークンなしには要求できません。

これは海賊行為のコストを大きく押し上げます。シングルキープラットフォームに通用する自動rip ツール(yt-dlp派生、ブラウザ拡張のダウンローダー)は、マルチキーターゲットごとに作り直す必要があり、ほとんどの場合誰もそこまでやりません。

署名付き再生トークン

各embedトークンにはメタデータが含まれます:

  • 許可オリジン(あなたのドメインホワイトリスト)
  • 任意の視聴者識別子(Enterpriseの動的ウォーターマークに使用)
  • 有効期限(既定24時間)
  • レート制限ヒント

署名鍵はサーバー側のみに存在します。偽造トークンは要求時の検証で弾かれます。

ゲーテッドコンテンツ(メンバー専用、コースアクセス)を提供する場合、アプリケーションは認証セッションごとに新しいembedトークンを生成し、セッションが切れるとトークンも失効します。AVCaptionのREST APIはEnterprise顧客向けにembedトークン生成を公開しています。

ドメインホワイトリスト

既定では、すべてのembed iframeはホットリンク前提です — ブラウザが埋め込みオリジン付きで Referer ヘッダーを送り、AVCaptionのstream APIがそのオリジンをホワイトリストと照合してからマスタープレイリストを発行します。

PremiumとEnterpriseでは、許可ドメインを正確に指定できます。ホワイトリスト外のドメインでiframeを埋め込んだ者は即座に403を受けます。

ここで多くの海賊行為が止まります: iframe URLを盗んで別サイトに埋め込むスクレーパーは、単に403を受け取り、プレーヤーは決して読み込まれません。

他プラットフォームとの比較

  • シングルキーAES-128(Bunny、CF Stream): 動画1本に鍵1本。一般的なホットリンクには強いが、トークン+鍵のペアが取られると弱い。
  • マルチキーAES-128(AVCaption): バッチごとに鍵をローテーション。設計上より強く、自動海賊行為のコストを上げる。
  • Widevine/PlayReady DRM(VdoCipher、JW Player Enterprise): ハードウェア紐付きライセンスサーバーとContent Decryption Module。最強だが高価で、スタジオライセンスのコンテンツでのみ必要。完全な比較は DRM vs 暗号化 を参照してください。

コース、ゲーテッドチュートリアル、有料メンバーシップコンテンツB2B研修、社内動画には、マルチキーAES-128が適切なバランスです。DRMは過剰、シングルキーは薄すぎます。

はじめる

暗号化セグメントの動きを実際に見たい場合は、テスト動画をアップロードしてください——最初の60秒で十分。DevToolsを開き、.m3u8.m4sのリクエストが飛ぶ様子を確認し、埋め込みURLに対してyt-dlpを試してみてください——セグメントは暗号化された状態で落ちてきて、バッチごとにローテーションされる鍵なしには再生できません。フリープランでもどの動画にもフルのマルチキースタックが乗ります。暗号化はデフォルト有効で、トグルは不要です。

よくあるご質問

AVCaptionはどの暗号化標準を使っていますか? +
HLSセグメントレベルで適用するAES-128(Advanced Encryption Standard、128ビット鍵)です。オンラインバンキングや主要ストリーミングサービスと同じ標準です。AVCaptionはセグメントバッチごとに(通常10セグメントごと)鍵をローテーションするため、漏洩した1つの鍵が露出するのは60秒ウィンドウのみです。
AES-128で十分ですか、それともDRM(Widevine/PlayReady)が必要ですか? +
自主制作コンテンツ(コース、チュートリアル、B2B研修、社内動画、有料メンバーシップ)であれば、AES-128マルチキーに署名付きURLとドメインホワイトリストを組み合わせれば十分です。DRMはスタジオライセンスのコンテンツを契約上の義務で配信する場合に必要です。
視聴者はブラウザから暗号鍵を取り出せますか? +
鍵は1再生セッション分だけ有効な署名付きURLでプレーヤーに配信されます。本気の攻撃者はDevTools経由で傍受可能ですが、その鍵は小さなセグメントバッチしか復号できません。AVCaptionのマルチキーローテーションでは、動画全体を抜き取るにはバッチごと、セッションごとに新鮮な鍵を取得する必要があるため、自動化された海賊行為のコストが高くなります。
← content.back_to_index