メディア暗号化

Derek Herman 氏
Derek Herman
ジョー・メドレー
Joe Medley

このセクションでは、メディアを暗号化するための 2 つの異なる戦略と、FFmpeg と Shaka Packager でそれらを使用する方法に関する実用的な例をいくつか説明します。これから説明する暗号化の戦略は、消去鍵Google Widevine などのサービスを使用する 2 通りです。どちらの戦略も、ユーザーがメディアでできることを制御するデジタル著作権管理(DRM)の一種です。ただし、認証のために鍵を渡す方法により、一方は本質的に他方よりも安全性が低くなります。そのため、DRM サービスのほうが理にかなっていることもあります。

ウェブ向けの主要な DRM サービスには、Google WidevineMicrosoft PlayReadyApple FairPlay がありますが、この記事ではそれらすべてを取り上げません。ただし、最新のブラウザをすべてターゲットにする場合は、3 つの DRM サービスをすべて使用する可能性があります。

変換と暗号化は次のアプリケーションで行われます。

鍵の暗号化をクリア

まず、クリアキーと使用すべきでないキーを十分に理解しておく必要があります。既存の DRM サービスを使用しないで、メディアの基本的な暗号化が実行可能な選択肢だと思われる場合は、クリアキーを使用します。ただし、このタイプの暗号化では、DRM サービスのいずれかを使用する場合と同じレベルのセキュリティは提供されないことに注意してください。これは、ライセンス サーバーに保存されている復号鍵で生成される暗号化された鍵とは異なり、Key-Value ペアは別の鍵で暗号化されないためです。また、クリアキーは Key-Value ペアを書式なしテキストとして送信するため、メディアを暗号化している間は、復号する鍵はシークレットではありません。

キーを作成

同じ方法で DASH と HLS の両方の鍵を作成できます。これには OpenSSL を使用します。以下では、16 個の 16 進数値で構成された暗号鍵を作成します。

openssl rand -hex 16 > media.key

IV を作成する

次に、初期化ベクトル(IV)を生成できます。

openssl rand -hex 16
6143b5373a51cb46209cfed0d747da66

クリアキーで暗号化する

次の例では、未加工の鍵を含む Shaka Packager を使用します。ここで、keyskey_ids は Shaka Packager に直接提供されます。その他の例については、ドキュメントをご覧ください。

key フラグには、以前に作成した鍵を使用します。この鍵は、media.key ファイルに保存されます。ただし、コマンドラインで入力する場合は、空白文字を削除してください。key_id フラグには、media.id 値を繰り返すか、上記で生成された IV 値を使用します。

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

鍵情報ファイルを作成する

HLS で暗号化するには、鍵ファイルに加えて鍵情報ファイルが必要です。鍵情報ファイルは、次の形式のテキスト ファイルです。拡張子は .keyinfo です。例: encrypt.keyinfo

key URI
key file path
private key

鍵の URI は、サーバー上の media.key上記で作成)が配置される場所です。鍵ファイルのパスは、鍵情報ファイルからの相対位置です。秘密鍵は、media.key ファイル自体の内容か、以前に作成した IV です。次に例を示します。

https://example.com/keys/media.key
/path/to/media.key
6143b5373a51cb46209cfed0d747da66

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/"

このコマンドでは、16 文字または 32 文字のキーを指定できます。

ffmpeg -i myvideo.mov -c:v libx264 -c:a aac -hls_key_info_file encrypt.keyinfo myvideo.m3u8

Widevine 暗号化

これで、クリアキー暗号化とは何か、またどのような場合に使用するのかがわかりました。しかし、セキュリティをさらに強化するために、どのような場合に DRM サービスを使用すべきでしょうか。ここで、Widevine などのサービスを使用してメディアを安全に暗号化および復号します。Widevine は MPEG-DASH と HLS をサポートする Google の DRM です。Widevine は、Google Chrome と Firefox のウェブブラウザ、Android MediaDRM、Android TV、および Widevine がコンテンツを復号する Encrypted Media Extensions と Media Source Extensions を使用するその他の家電デバイスで使用されています。

Widevine で暗号化

この記事の例のほとんどでは、クリアキー暗号化を使用しています。ただし、Widevine では次のオプションを置き換えることができます。

--enable_fixed_key_encryption \
--enable_fixed_key_decryption \
--keys label=:key=INSERT_KEY_HERE:key_id=INSERT_KEY_ID_HERE

ファイルの名前と --content-id フラグを除く、demultiplexer(demux)コマンドのすべての内容をこの例からコピーする必要があります。--content-id は、16 桁または 32 桁のランダムな 16 進数です。独自のキーではなく、ここで提供されたキーを使用します。その他の例については、Widevine Key Server の使用に関する Shaka Packager のドキュメントをご覧ください。

  1. 音声と動画を分離し、新しいファイルを暗号化して、メディア プレゼンテーション記述(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. 音声ストリームと動画ストリームを再多重化する(結合する)。動画フレームワークを使用している場合は、この操作を行う必要はありません。

    ffmpeg -i glocken_video.mp4 -i glocken_audio.m4a -c copy glocke.mp4
    

メディア変換シーケンス

このセクションでは、未加工の .mov ファイルから、DASH または HLS 用にパッケージ化された暗号化アセットを取得するために必要なコマンドを順番に説明します。ここでは、説明のために、ソースファイルを解像度 1080p(1920 x 1080)で 8 Mbps のビットレートに変換します。必要に応じて値を調整します。

DASH/WebM

  1. ファイル形式とコーデックを変換します。

    このコマンドでは、オーディオ コーデックに liborbis または libopus を使用できます。

    ffmpeg -i glocken.mov -c:v libvpx-vp9 -c:a libvorbis -b:v 8M -vf setsar=1:1 -f webm tmp_glocken.webm
    
  2. クリアキー暗号鍵を作成します。

    openssl rand -hex 16 > media.key
    
  3. 音声と動画を分離し、新しいファイルを暗号化して、メディア プレゼンテーション記述(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. 音声ストリームと動画ストリームを再多重化する(結合する)。動画フレームワークを使用している場合は、この操作を行う必要はありません。

    ffmpeg -i glocken_video.webm -i glocken_audio.webm -c copy glocken.webm
    

DASH/MP4

  1. ファイル形式、動画コーデック、ビットレートを変換します。

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 tmp_glocken.mp4
    
  2. クリアキー暗号鍵を作成します。

    openssl rand -hex 16 > media.key
    
  3. 音声と動画を分離し、新しいファイルを暗号化して、メディア プレゼンテーション記述(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. 音声ストリームと動画ストリームを再多重化する(結合する)。動画フレームワークを使用している場合は、この操作を行う必要はありません。

    ffmpeg -i glocken_video.mp4 -i glocken_audio.m4a -c copy glocken.mp4
    

HLS/MP4

HLS は MP4 のみをサポートしているため、最初に MP4 コンテナとサポートされているコーデックに変換する必要があります。

  1. ファイル形式、動画コーデック、ビットレートを変換します。

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 glocken.mp4
    
  2. クリアキー暗号鍵を作成します。

    openssl rand -hex 16 > media.key
    
  3. 鍵情報ファイルを作成する

    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
    

ここまでの説明は大変でしたが、自信を持ってメディアを暗号化できるようになったことを願っています。次に、サイトにメディアを追加する方法を説明します。