DRMで音声コンテンツを不正利用から守る(Android + ExoPlayer) part 1
この記事は Voicy Advent Calendar 2020 20日目の記事です。
前日は @miyukiaizawa さんの RaspberryPI4をサーバーにして遊び倒す。その2 でした。
明日は @natacon さんの IntelliJ IDEAのHTTPクライアントが使いやすい話です。
音声コンテンツ配信を行うサービス事業者としてコンテンツを保護することは重要な意味を持ちます。
DRMはオンライン動画や音声サービスなどに対して、サービス提供者の認可を必要とさせる技術です。今回はそのDRM の抑えておきたいポイントとExoPlayerを紹介します。
ExoPlayerとは
Androidで動画や音楽のメディアを扱うためのMediaPlayer OSS Libraryです。
DASHやSmoothStreamingアダプティブ再生・HLSなど、Android標準のMediaPlayerAPIで現在サポートされていない機能をサポートしています。
VoicyでもAndroidの再生アプリで採用しています。
公式Blogで定期的に更新内容や内部仕様を配信されていたり、リファレンスが用意されていて、実践的に使っていく上でドキュメントが豊富なのはありがたいですね。
ExoPlayerがサポートする暗号化
ExoPlayerではWidevine cenc と cbcs, ClearKey, PlayReadyの4種類のDRMスキーマをサポートしています。OS4.4 以上であれば cenc、OS7.1 以上であれば cbcs、cbc1、cenc が使用できます。
Clearkey
Clearkeyは、DRMシステムの1つで、CDMやライセンスサーバーを必要としません。
CDMを使用せずにブラウザや端末のみでCENC復号化を行います。Clearkeyは、ブラウザがCENC復号に対応しているかどうか確認するために使用されることが多いです。
セキュリティレベルは他のDRMシステムと比べると下がりますので商用向けではありません。
理由は、JSONの平文キーでやり取りしているので通信キャプチャされてしまうとkey情報などが漏れる恐れがあり、堅牢性が低くなるからです。
そもそもDASHのみのサポートでHLSはサポートしてないので、HLSで配信しているVoicyとしては除外するのかなというところです。
Clear key の仕様
PlayReady
Microsoftマイクロソフトが開発したDRM技術で、Windows PhoneやIEが対象です。PlayReadyはAndroidTVのみなのでこちらも選択肢から外れます。
Widevine
Widevineは、Googleが提供するDRMシステムです。
Widevineで暗号化されたメディアファイルを再生するためには、Widevineのライセンスサーバーと、それに対応したCDMを搭載したブラウザや端末が必要になります。ProtocolBufferでやり取りが行われます。
AndroidではWidevineを使用するのが一般的ですので、この後からはWidevineについて解説していきます。
CDMとは
DRMの仕組みを理解していくにはCDMというものを知る必要があります。
CDM=Content Decryption Moduleの略です。DRMコンテンツを復号化するための役割を持っています。
コンテンツ復号化モジュール(CDM)は、暗号化(DRM)コンテンツを復号化するために使用されるWebブラウザーや端末に組み込まれた独自のソフトウェアです。
Widevine 用の CDM や PlayReady 用の CDM などがあり、例えば Widevine を再生したければ端末を提供しているベンダーは Google に認可された CDM を正しく搭載している必要があります。
DRM InfoというAndroidアプリで自分の端末のセキュリティレベルとCDM情報が見れます。次の画像は Xiaomi に搭載されている CDM 情報です。
Xiaomi端末ではClearKeyやWidevineのコンテンツは再生できるが、PlayReadyのコンテンツは再生できません。
ライセンスサーバー
CDMの次に必要になってくるのがライセンスサーバーです。
対象のDRMコンテンツを復号化するため認可情報のやり取りを行うサーバーです。
例えば、Widevine であればアプリは Google の管理するライセンスサーバーに対してライセンスリクエストを行うことに なります。
Widevine -> Google
FairPlay -> Apple
PlayReady -> Microsoft
まとめ
ここまで紹介してきた通り、全てのデバイスやブラウザでサポートされているDRMというのは存在せず、サーバーサイドではクライアント別にDRMコンテンツを配信し分ける対応が必要になってきます。
ライセンスサーバとのレイテンシがどのくらいなのか実証して明らかにしていく必要があります。
コンテンツを暗号化しAndroid(ExoPlayer)で複合化していく実践部分は次回の記事で紹介できたらと思います。
最後まで読んでいただきありがとうございます。誤っている部分などあれば今後に活かしていきたくご指摘いただければ幸いです。