DRM(デジタル著作権管理)は、デジタルコンテンツの不正コピーや配布を防ぐための一連の技術です。モバイルアプリケーションでは、DRMはビデオ、オーディオ、電子書籍を暗号化し、権利者と消費者の間のライセンス契約の遵守を確保するために使用されます。Google Widevine Documentation、2026によると、DRMはほとんどのストリーミングサービス(Netflix、Spotify、Apple TV+)に組み込まれており、プレミアムコンテンツの合法的な配信には必須です。
重要ポイント
DRMは、デジタルコンテンツへのアクセスを制御する暗号化およびソフトウェア手法の集合体です。単純な暗号化とは異なり、DRMにはライセンスシステムが含まれています。コンテンツは暗号化されており、表示するにはユーザーの権利を確認した後にのみ発行されるキーが必要です。
DRMの主な目的は、海賊行為を防ぎ、地域制限の遵守を確保することです。DRMがなければ、コンテンツ所有者(映画スタジオ、レコードレーベル)はストリーミングプラットフォームにコンテンツをライセンスしません。Motion Picture Association(2025)によると、DRMによりストリーミングでの映画の違法配布はDVDリップ時代と比較して62%削減されました。
モバイル開発では、DRMはメディアプレーヤーレベルで組み込まれます。開発者はExoPlayer(Android)、AVPlayer(iOS)、またはShaka Player(Web)を使用します。これらは暗号化されたストリームの組み込み復号をサポートしています。開発者は暗号化を実装する必要はなく、ライセンス用のSDKを統合するだけです。
CENC標準(共通暗号化—ISO/IEC 23001-7)は、1つの暗号化メディアファイルをすべてのDRMシステムで使用することを可能にします。コンテンツは一度暗号化され、キーは異なるライセンスサーバーを介して配布されます。これはマルチプラットフォームサービスにとって重要です。Netflixは映画を一度暗号化し、再エンコードすることなくAndroid(Widevine)、iOS(FairPlay)、Windows(PlayReady)に配信します。
CENCは、オーディオトラックとビデオトラックに異なるキーを使用するCBC暗号化を採用しています。各キーはMPD(MPEG-DASH)またはM3U8(HLS)マニフェストに暗号化されて保存されます。コンテンツ識別子(KID)は暗号化ストリームをサーバー上のライセンスにリンクします—有効なライセンスがなければキーは復号できません。
DRM再生プロセスは、マニフェストの読み込み、ライセンスの取得、コンテンツの復号、表示の4つの段階で構成されます。各段階は、メディアプレーヤー、CDMモジュール、ライセンスサーバーというシステムの異なるコンポーネントによって実行されます。
CDMは、コンテンツの復号を実行する保護されたソフトウェアまたはハードウェアモジュールです。Androidでは、CDMはMediaDrm APIレベルで実装されています。iOSでは、AVContentKeySessionを介してAVFoundationに組み込まれています。CDMはキーをアプリケーションに公開することはなく、すべての暗号化操作はセキュア環境(TEE—Trusted Execution Environment)内で実行されます。
ハードウェアサポート(セキュリティレベル1)のあるデバイスでは、CDMはTEE内で動作し、キーはデバイスのメインメモリに入ることはありません。これは4K HDRコンテンツを再生するためのスタジオの要件です。TEEのないデバイスでは、キーはソフトウェアで復号され(L3)、セキュリティが低下し、最大品質は540pに制限されます。
3つのDRMシステムがモバイルプラットフォームを支配しています。それぞれが独自のエコシステムに固有ですが、すべてCENCをサポートしており、単一の暗号化コンテンツストリームをすべてのプラットフォームで使用できます。
| DRM | 開発者 | プラットフォーム | 最大品質 | ハードウェア保護 |
|---|---|---|---|---|
| Widevine | Android、Chrome、Android TV | 4K HDR(L1) | TEE(L1) | |
| FairPlay | Apple | iOS、iPadOS、macOS、tvOS | 4K HDR(iOS) | Secure Enclave |
| PlayReady | Microsoft | Windows、Xbox、Windows Phone | 4K(SL3000) | TPM + TEE |
すべてのプラットフォームで動作するストリーミングサービスには、3つすべてのDRMシステムのサポートが必要です。実用的な解決策は、マルチDRM対応のCDN(Muvi、Vualto、Axinom)を使用することで、ユーザーのデバイスに基づいてライセンス要求を適切なサーバーに自動的にルーティングします。Streaming Learning Center(2025)によると、78%のストリーミングサービスがマルチDRMアプローチを採用しています。
CENCを使用したMPEG-DASH標準はアーキテクチャを簡素化します。コンテンツは共有キーで一度暗号化され、DRMシステムはクライアント側で選択されます。ライセンスサーバーはデバイス識別子を含む要求を受け取り、特定のCDM用に暗号化されたキーを返します。異なるプラットフォームでコンテンツに違いはなく、異なるのはライセンスサーバーだけです。
WidevineはGoogleのDRMシステムであり、Androidのデファクトスタンダードです。3つのセキュリティレベルをサポートし、コンテンツの復号がどこでどのように実行されるかを決定します。セキュリティレベルはデバイスのハードウェア能力に依存し、最大コンテンツ解像度を決定します。
Widevine L1(ハードウェア)—最も安全なレベル。すべての暗号化操作はTrusted Execution Environment(TEE)内で実行されます。キーは安全な領域から出ることはありません。L1デバイスは最大4K HDRのコンテンツを再生できます。Googleの認証が必要で、これはフラッグシップデバイスが受けるプロセスです。
Widevine L3(ソフトウェア)—復号はデバイスのメインメモリで実行されます。技術的に熟練した攻撃者がキーを抽出できる可能性があります。プレミアムコンテンツの解像度は540p(960x540)に制限されています。すべてのAndroidデバイスはL1認証を受けていなくてもL3をサポートしています。
Widevine L2—稀な中間レベルで、復号はTEEで実行されますが、レンダリングは保護されていない経路で行われます。一部のスマートTVで使用されています。モバイルデバイスでは事実上見つかりません。
import android.media.MediaDrm
import android.media.UUID
fun checkWidevineLevel(): String {
val widevineUuid = UUID.fromString("edef8ba9-79d6-4ace-a3c8-27dcd51d21ed")
val mediaDrm = MediaDrm(widevineUuid)
val securityLevel = mediaDrm.getPropertyString(
MediaDrm.PROPERTY_SECURITY_LEVEL
)
return when (securityLevel) {
"L1" -> "Widevine L1 — ハードウェア保護"
"L3" -> "Widevine L3 — ソフトウェア保護"
else -> "Widevine $securityLevel"
}
}
このメソッドはWidevine UUIDを介してCDMにsecurityLevelプロパティを問い合わせます。戻り値はL1、L2、またはL3の文字列で、デバイスの現在の保護レベルを示します。この情報はストリーミングサービスにとって重要です。デバイスがL3のみの場合、4Kコンテンツを表示できません。
FairPlayはAppleのDRMシステムで、すべてのエコシステムプラットフォーム(iOS、iPadOS、macOS、tvOS、watchOS)に組み込まれています。Widevineとは異なり、FairPlayにはセキュリティレベルがなく、保護はデバイスによって決定されます。Secure Enclave搭載のiOSでは、FairPlayはWidevine L1に匹敵する保護レベルを提供します。
FairPlayはHLS(HTTP Live Streaming)プロトコルでのみ動作します。コンテンツは.tsセグメント(MPEG-TS)または.m4sフラグメント(fMP4)にパッケージ化されます。M3U8マニフェストには、ライセンスサーバーURI(KSM—Key Server Module)と初期化IVを含む#EXT-X-KEYタグが含まれています。再生開始時に、AVPlayerがマニフェストを読み取り、AVContentKeySessionを介してキーを要求します。
import AVFoundation
let contentKeySession = AVContentKeySession(keySystem: fairPlayStreaming)
let player = AVPlayer(playerItem: playerItem)
contentKeySession.setDelegate(self, queue: delegateQueue)
func contentKeySession(
_ session: AVContentKeySession,
didProvide keyRequest: AVContentKeyRequest
) {
let assetId = keyRequest.identifier as! String
sendLicenseRequest(assetId) { licenseData in
keyRequest.processContentKeyResponse(
AVContentKeyResponse(fairPlayStreamingKeyResponseData: licenseData)
)
}
}
AVContentKeySessionのデリゲートは、コンテンツ識別子(assetId)とともにキー要求を受け取ります。アプリケーションはこのIDをライセンスサーバー(KSM)に送信し、サーバーは暗号化されたキーを返します。processContentKeyResponseを呼び出すと、キーがCDMに渡されて復号されます。ライセンスが無効(期限切れ、未払い)の場合、サーバーは403エラーを返し、AVPlayerは再生を開始しません。
FairPlayは永続キーをサポートしています。これはオフライン視聴のためにデバイスにライセンスを保存する機能です。キーを受け取った後、アプリケーションはallowsPersistableKeyフラグを付けてprocessContentKeyResponseを呼び出します。キーはKeychainに保存され、その後の再生時にサーバーに問い合わせることなく使用できます。ただし、オフラインライセンスには有効期限があり、通常7〜30日で更新が必要です。
オフラインライセンスはiOSの保護ストレージ(Keychain)に保存されます。脱獄やダンプ抽出の試みがあった場合、Secure Enclaveがキーを破壊します。Apple(2025)によると、永続キー技術はApple TV+、Netflix、Disney+で旅行前にiPadにコンテンツをダウンロードするために使用されています。
PlayReadyはMicrosoftのDRMで、Windows、Xbox、レガシーWindows Phoneで使用されています。PlayReadyはモバイルデバイスではWidevineやFairPlayほど一般的ではありませんが、すべてのMicrosoftプラットフォームで動作するユニバーサルストリーミングソリューションにとって重要です。PlayReadyはTPMを介してソフトウェアとハードウェアの両方の保護をサポートしています。
PlayReadyはSL(セキュリティレベル)アーキテクチャを採用しています。SL2000(ソフトウェア、Widevine L3に類似)、SL3000(ハードウェア、L1に類似)。Xbox Series Xでは、PlayReady SL3000はTEE+TPMを介して動作し、キーは保護された環境でのみ抽出されます。これにより、コピーのリスクなしにコンソールで4K Blu-rayを再生できます。
Microsoft Docs(2026)によると、PlayReadyはCENCをサポートし、EdgeブラウザのMedia Source Extensions(MSE)を介してMPEG-DASHで動作できます。AndroidおよびiOSのモバイルアプリケーションでは、PlayReadyはSDKを介して利用可能ですが、主にエンタープライズアプリケーションやMicrosoftメディアサービスで使用され、広くは使われていません。
MicrosoftはAndroidおよびiOS向けにPlayReady Native SDKを提供しています。統合はPlayReady拡張機能を使用したExoPlayerを介して行われます。開発者はPlayReadyRendererを追加し、これがデコードチェーンに組み込まれます。ExoPlayerはMPDマニフェストで指定されたDRMに基づいて、WidevineとPlayReadyを自動的に切り替えます。
PlayReadyはモバイルアプリケーションではほとんど使用されませんが、Microsoftエコシステム内のサービス(例えば、SharePointやStreamのエンタープライズトレーニングプラットフォーム)ではサポートが必須です。Microsoft(2025)によると、PlayReadyはエンタープライズメディアソリューションの23%で使用されており、Widevineは62%です。
モバイルアプリケーションへのDRM統合には暗号化コードを書く必要はありません。開発者はDRMをネイティブサポートするプレーヤーを使用します。DRM拡張機能を使用したExoPlayerを介したAndroidでの統合を見てみましょう。
val drmSessionManager = DefaultDrmSessionManager.Builder()
.setUuidAndExoMediaDrmProvider(
C.WIDEVINE_UUID,
FrameworkMediaDrm.DEFAULT_PROVIDER
)
.setMultiSession(true)
.build(mediaDrmCallback)
val mediaItem = MediaItem.Builder()
.setUri(mpdUrl)
.setDrmConfiguration(
MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
.setLicenseUri(licenseUrl)
.setLicenseRequestHeaders(headers)
.build()
)
.build()
exoPlayer.setMediaItem(mediaItem)
exoPlayer.prepare()
DefaultDrmSessionManagerはDRMセッションを管理します。MediaDrmセッションを作成し、ライセンス要求を処理し、キーをデコーダーに渡します。setMultiSession(true)パラメータは、異なるセッションで複数のストリーム(オーディオ+ビデオ)を同時に復号することを可能にします。MediaDrmCallbackはライセンスサーバーへのHTTP要求を実装します。通常はSignedRequestボディを含むPOSTです。
val mediaDrmCallback = DefaultDrmSessionManager.MediaDrmCallback {
url, requestBody ->
val response = OkHttpClient().newCall(
Request.Builder()
.url(url)
.post(RequestBody.create(requestBody, MediaType.parse("application/octet-stream")))
.addHeader("Authorization", "Bearer " )
.build()
).execute()
val responseBytes = response.body?.bytes()
?: throw DrmSessionException(Exception("Empty license response"))
responseBytes
}
コールバックは、Widevine UUIDをボディに含むPOST要求をライセンスサーバーに送信します。サーバーはユーザーの認証(ヘッダーのトークン)を確認し、暗号化されたキーを返します。ユーザーにアクティブなサブスクリプションがない場合、サーバーは403 Forbiddenを返し、ExoPlayerはDRMエラーを生成します。これはonPlayerErrorを介して処理する必要があります。
DRMエラーは、ライセンスが無効、期限切れ、またはデバイスが必要な保護レベルをサポートしていない場合に発生します。ExoPlayerはPlayer.Listener.onPlayerErrorを介してTYPE_DRM_LICENSE_EXPIRED、TYPE_DRM_UNSUPPORTED、またはTYPE_SOURCEコードでエラーを渡します。ユーザーに情報メッセージを表示することをお勧めします:“このデバイスではコンテンツを利用できません”または“視聴するにはサブスクリプションを更新してください。”
ストリーミングサービスの分析(2025)によると、最大8%の再生開始失敗がDRMエラーに関連しています。そのうち60%は期限切れのライセンス、25%はデバイスの非互換性、15%はキー要求時のネットワークエラーです。5秒後の自動再試行によりネットワークエラーケースの40%が解決されます。
よくある質問
Widevine L3(ソフトウェア保護)のデバイスでは技術的に可能で、メモリからキーを抽出できます。L1およびSecure Enclave搭載のFairPlayでは回避は非常に困難で、TEEへの物理的アクセスが必要です。コンテンツスタジオはプレミアムコンテンツにL1デバイスを対象としています。
おそらくデバイスがWidevine L1認証を受けておらず、L3を使用しています。NetflixはL3デバイスで品質を540pに制限します。Google PlayのDRM InfoアプリでWidevineレベルを確認してください。Samsung、Pixel、OnePlusのフラッグシップデバイスは通常L1を搭載しています。
マルチDRMを使用してください。AndroidにはWidevine、AppleにはFairPlay、WindowsにはPlayReady。AxinomやVualtoなどのサービスは3つすべてのDRMシステムに統一APIを提供します。コンテンツはCENCを介して一度暗号化され、DRMの選択はクライアント側で自動的に行われます。
iOSでは、AVContentKeySessionを介してFairPlayの永続キーを使用します。Androidでは、ExoPlayer OfflineLicenseHelperを介してWidevineオフラインライセンスを使用します。キーは制限付きの有効期限(通常7〜30日)でKeychain(iOS)またはKeyStore(Android)にローカル保存されます。
KID(キーID)—CENCマニフェスト内の暗号化キーの一意の16バイト識別子。各KIDはコンテンツの特定の部分(例えば映画の10分間のセグメント)に結び付けられています。ライセンスサーバーはKIDを使用してデータベース内の対応するキーを検索します。1つの映画に異なる部分用に最大20の異なるKIDが含まれることがあります。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。