このセクションでは、メディアを暗号化するための 2 種類の戦略について説明し、FFmpeg と Shaka Packager でそれらを使用する方法の実用的な例をいくつか紹介します。ここでは、鍵をクリアする方法と、Google Widevine などのサービスを使用する 2 つの暗号化戦略について説明します。どちらの戦略も、ユーザーがメディアに対して行える操作を制御するデジタル著作権管理(DRM)の一形態です。ただし、認証のために鍵を渡す方法の点で、一方は本質的に他方よりも安全性が劣ります。これが DRM サービスが合理的である理由です。
ウェブ向けの主な DRM サービスには、Google Widevine、Microsoft PlayReady、Apple FairPlay がありますが、この記事ではそのすべてについては説明しません。ただし、最新のブラウザをすべてターゲットにする場合は、3 つの DRM サービスすべてを使用する可能性があります。
変換と暗号化は、次のアプリケーションで行われます。
鍵の暗号化をクリア
まず、クリアキーを使用する前に、クリアキーの概要と使用すべきでないキーを十分に理解する必要があります。既存の DRM サービスを使用せず、メディアの基本的な暗号化が有効なオプションであると思われる場合は、クリア鍵を使用します。ただし、このタイプの暗号化は、いずれかの DRM サービスを使用する場合と同じレベルのセキュリティを提供しません。これは、ライセンス サーバーに保存されている復号鍵によって生成される暗号化された鍵とは異なり、Key-Value ペアが別の鍵で暗号化されないためです。また、Clear Key は Key-Value ペアを書式なしテキストとして送信するため、メディアを暗号化する際、復号する鍵はシークレットではありません。
キーを作成
同じ方法で DASH と HLS の両方のキーを作成できます。この操作には OpenSSL を使用します。以下では、16 個の 16 進数値からなる暗号鍵を作成します。
openssl rand -hex 16 > media.key
IV を作成する
次に、初期化ベクトル(IV)を生成します。
openssl rand -hex 16
6143b5373a51cb46209cfed0d747da66
クリアな鍵で暗号化する
次の例では、未加工の鍵を持つ Shaka Packager を使用します。ここで、keys
と key_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 など、Encrypted Media Extensions と Media Source Extensions を使用するその他の家電デバイス(Widevine がコンテンツを復号する)で使用されます。
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 のドキュメントをご覧ください。
音声と動画を Demux(分離)し、新しいファイルを暗号化して、Media Presentation Description(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"
音声ストリームと動画ストリームを再多重化(結合)します。動画フレームワークを使用している場合は、この操作を行う必要はありません。
ffmpeg -i glocken_video.mp4 -i glocken_audio.m4a -c copy glocke.mp4
メディア コンバージョン シーケンス
このセクションでは、未加工の .mov
ファイルから、DASH または HLS 用にパッケージ化された暗号化されたアセットを取得するために必要なコマンドを順番に説明します。ここでは、わかりやすく説明するために、ソースファイルを解像度 1080p(1920 x 1080)の 8 Mbps のビットレートに変換します。これらの値は、必要に応じて調整してください。
DASH/WebM
ファイル形式とコーデックを変換します。
このコマンドでは、オーディオ コーデックに
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
クリア鍵暗号鍵を作成します。
openssl rand -hex 16 > media.key
音声と動画を Demux(分離)し、新しいファイルを暗号化して、Media Presentation Description(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
音声ストリームと動画ストリームを再多重化(結合)します。動画フレームワークを使用している場合は、この操作を行う必要はありません。
ffmpeg -i glocken_video.webm -i glocken_audio.webm -c copy glocken.webm
DASH/MP4
ファイル形式、動画コーデック、ビットレートを変換します。
ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 tmp_glocken.mp4
クリア鍵暗号鍵を作成します。
openssl rand -hex 16 > media.key
音声と動画を Demux(分離)し、新しいファイルを暗号化して、Media Presentation Description(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
音声ストリームと動画ストリームを再多重化(結合)します。動画フレームワークを使用している場合は、この操作を行う必要はありません。
ffmpeg -i glocken_video.mp4 -i glocken_audio.m4a -c copy glocken.mp4
HLS/MP4
HLS は MP4 のみをサポートしているため、まず MP4 コンテナとサポートされているコーデックに変換する必要があります。
ファイル形式、動画コーデック、ビットレートを変換します。
ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 glocken.mp4
クリア鍵暗号鍵を作成します。
openssl rand -hex 16 > media.key
重要な情報ファイルを作成する
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
説明が大変でしたが、これで自信を持ってメディアを暗号化できるようになれば幸いです。次に、サイトにメディアを追加する方法を説明します。