移动应用中的DRM:基础、保护方案与工作原理

作者: IT Sectr 发布日期: 2026-05-24 阅读时间: 11 分钟

DRM(数字权管理)——是一套保护数字内容免受未经授权复制和传播的技术。在移动应用中,DRM用于加密视频、音频和电子书,确保版权所有者与消费者之间的许可协议得到遵守。据Google Widevine Documentation, 2026DRM嵌入了多数流媒体服务——Netflix、Spotify、Apple TV+——并且是合法发行高级内容的必要条件。

核心要点

  • DRM(数字权管理)——保护著作权的技术,限制数字内容的复制和传播。
  • 三种主要方案:Widevine(Google)、FairPlay(Apple)、PlayReady(Microsoft)​——主导移动平台。
  • Widevine通过CDM在Android和iOS上工作,支持三个安全级别:L1L2L3
  • Apple的FairPlay使用KSM服务器生成密钥,并嵌入到iOS和macOS的AVFoundation中。
  • DRM解密发生在媒体播放器层面——开发者通过ExoPlayer或AVPlayer获取已就绪的视频流。

什么是DRM?

DRM——是一组控制对数字内容访问的加密和软件方法。与简单加密不同,DRM包括许可证系统:内容被加密,需要经过用户权限检查后才会发放密钥才能观看。

DRM的主要任务是防止盗版并确保区域限制得到遵守。没有DRM,内容所有者(电影制片厂、录音公司)不会将其内容授权给流媒体平台。据Motion Picture Association (2025)报告,与DVD抽取时代相比,使用DRM使得电影在流媒体中的非法传播减少了62%。

在移动开发中,DRM嵌入在媒体播放器层面:开发者使用ExoPlayer(Android)、AVPlayer(iOS)或Shaka Player(Web),它们支持对加密流的内置解密。开发者无需实现加密算法——只需集成用于授权的SDK即可。

DRM与CENC(共同加密)

CENC(共同加密——ISO/IEC 23001-7)标准允许所有DRM系统使用单一加密媒体文件。内容被加密一次,密钥通过不同的授权服务器分发。这对于多平台服务至关重要:Netflix将电影加密一次,并无需重新编码即可将其提供给Android(Widevine)、iOS(FairPlay)和Windows(PlayReady)。

CENC使用对音频和视频轨道使用不同密钥的CBC加密。每个密钥以加密形式存储在MPD(MPEG-DASH)或M3U8(HLS)的清单中。内容标识符(KID)将加密流与服务器上的许可证关联起来——没有有效的许可证,密钥将无法解密。

DRM在移动应用中如何工作

DRM播放过程由四个阶段组成:加载清单、获取许可证、解密内容和显示。每个阶段由系统的不同组件执行——媒体播放器、CDM模块和授权服务器。

  • 加载清单——播放器接收到含有加密片段、加密方案和授权服务器URL元数据的MPD(DASH)或M3U8(HLS)。
  • 请求许可证——播放器将内容标识符(KID)传递给内容解密模块(CDM),该模块向授权服务器发送请求。
  • 获取密钥——服务器检查用户权限(订阅、地区、设备),并返回用设备公钥加密的密钥。
  • 解密流——CDM使用设备私钥解密密钥,并将其传递给播放器以实时解密视频片段。

内容解密模块(CDM)

CDM——是一个受保护的软件或硬件模块,用于执行内容解密。在Android上,CDM在MediaDrmAPI层面实现;在iOS上,通过AVContentKeySession嵌入到AVFoundation中。CDM从不向应用程序泄露密钥——所有加密操作都在受保护环境(TEE——可信执行环境)内执行。

在具有硬件支持(Secure Level 1)的设备上,CDM在TEE内工作——密钥从不进入设备主内存。这是制片厂对以4K HDR播放内容的要求。在没有TEE的设备上,密钥通过软件方式解密(L3),这降低了保护程度并且将最高质量限制在540p。

主要DRM方案

在移动平台上,三个DRM系统主导。每个系统对其生态系统独家专用,但都支持CENC,这使得在所有平台上可以使用单一加密内容。

DRM开发者平台最高质量硬件保护
WidevineGoogleAndroid, Chrome, Android TV4K HDR (L1)TEE (L1)
FairPlayAppleiOS, iPadOS, macOS, tvOS4K HDR (iOS)Secure Enclave
PlayReadyMicrosoftWindows, Xbox, Windows Phone4K (SL3000)TPM + TEE

为多平台服务选择DRM

对于在所有平台上都能工作的流媒体服务,需要支持所有三种DRM。实用的解决方案是使用具有多DRM支持的CDN(Muvi、Vualto、Axinom),它们会根据用户的设备自动将授权请求路由到相应的服务器。据Streaming Learning Center (2025)报告,78%的流媒体服务使用Multi-DRM方法。

带有CENC的MPEG-DASH标准简化了架构:内容使用共享密钥加密一次,而DRM系统在客户端选择。授权服务器接收到带有设备标识符的请求,并返回针对特定CDM加密的密钥。不同平台的内容没有区别——只是授权服务器不同。

Widevine:级别与特点

Widevine——Google的DRM系统,是Android上事实上的标准。它支持三个安全级别,决定内容解密的地点和方式。安全级别取决于设备的硬件能力,并决定内容的最高分辨率。

Widevine安全级别

Widevine L1(硬件)——最安全的级别。所有加密操作都在可信执行环境(TEE)内执行。密钥从不离开受保护的区域。具有L1的设备可以播放最高4K HDR的内容。需要Google认证——这是旗舰设备经历的一个程序。

Widevine L3(软件)——解密发生在设备的主内存中。密钥可能被技术熟练的攻击者抽取。高级内容的分辨率限制为540p(960x540)。所有Android设备都支持L3,即使它们没有获得L1认证。

Widevine L2——一个稀有的中间级别,解密在TEE中进行,但渲染通过未受保护路径。使用于某些智能电视。在移动设备上几乎不会出现。

如何小定设备上的Widevine级别

kotlin
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内容。

Apple FairPlay:架构与工作原理

FairPlay——Apple的DRM系统,嵌入到生态系统的所有平台:iOS、iPadOS、macOS、tvOS和watchOS。与Widevine不同,FairPlay没有安全级别——保护由设备决定。在带有Secure Enclave的iOS上,FairPlay提供与Widevine L1可比的保护级别。

FairPlay专门与HLS(HTTP流媒体播放)协议配合工作。内容被打包成.ts(MPEG-TS)片段或.m4s(fMP4)片段。M3U8清单包含#EXT-X-KEY标签,具有授权服务器(KSM——密钥服务器模块)的URI和初始化IV。开始播放时,AVPlayer读取清单并通过AVContentKeySession请求密钥。

FairPlay Streaming集成

swift
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。密钥保存在键锩中,并可在重复观看时无需访问服务器即可使用。但是,离线许可证的有效期有限——通常为7–30天,此后需要更新。

离线许可证存储在iOS的受保护存储中——键锩。在尝试攻击(越犱、提取内存转储)时,Secure Enclave会销毁密钥。据Apple (2025)报告,持久密钥技术被用于Apple TV+、Netflix和Disney+中,以便在旅行前将内容下载到iPad。

Microsoft PlayReady为普遍保护

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媒体服务。

用于Android的PlayReady原生SDK

Microsoft为Android和iOS提供PlayReady原生SDK。集成通过含有PlayReady扩展的ExoPlayer实现:开发者添加PlayReadyRenderer,它嵌入到解码链中。ExoPlayer根据MPD清单中指定的DRM自动在Widevine和PlayReady之间切换。

尽管PlayReady在移动应用中不常见,但对于属于Microsoft生态系统的服务(例如SharePoint和Stream上的企业培训平台)而言,其支持是必不可少的。据Microsoft (2025)报告,PlayReady用于23%的企业媒体解决方案,而Widevine则卢62%。

将DRM集成到移动应用中

将DRM集成到移动应用中不需要编写加密代码——开发者使用的播放器默认支持DRM。让我们看看通过含有DRM扩展的ExoPlayer在Android上的集成。

配置支持Widevine的ExoPlayer

kotlin
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请求。

用于授权请求的MediaDrmCallback

kotlin
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错误处理

当许可证无效、过期或设备不支持所需保护级别时,会发生DRM错误。ExoPlayer通过Player.Listener.onPlayerError传递错误,错误代码为TYPE_DRM_LICENSE_EXPIRED、TYPE_DRM_UNSUPPORTED或TYPE_SOURCE。建议向用户显示提示性信息:“此设备不可用该内容”或“延长订阅以观看”。

据流媒体服务分析 (2025)报告,达到8%的播放失败与DRM错误有关。其中,60%是过期的许可证,25%是设备不兼容,15%是请求密钥时的网络错误。在5秒后自动重试可解决40%的网络错误情况。

常见问题

可以在移动设备上绕过DRM吗?

在具有Widevine L3(软件保护)的设备上从技术上是可能的,密钥可以从内存中提取。在L1和带有Secure Enclave的FairPlay上,绕过是极其困难的——需要对TEE的物理访问。内容制片厂针对高级内容使用L1设备。

为什么Netflix在我的Android上显示低质量?

很可能设备没有获得Widevine L1认证并使用L3。Netflix将L3设备上的质量限制为540p。通过Google Play中的DRM Info应用检查Widevine级别。Samsung、Pixel和OnePlus的旗舰设备通常具有L1。

哪种DRM更适合流媒体服务?

使用Multi-DRM:Widevine用于Android、FairPlay用于Apple、PlayReady用于Windows。Axinom或Vualto等服务为所有三种DRM提供统一API。内容通过CENC加密一次,DRM选择在客户端自动进行。

如何实现带有DRM的离线观看?

在iOS上,通过AVContentKeySession使用FairPlay的持久密钥。在Android上,通过ExoPlayer OfflineLicenseHelper使用Widevine离线许可证。密钥本地保存在Keychain(iOS)或KeyStore(Android)中,有效期有限——通常为7到30天。

在DRM上下文中,什么是KID?

KID(密钥标识符)——是CENC清单中加密密钥的唯一的16字节标识符。每个KID与特定的内容片段(例如电影的10分钟片段)相关联。授权服务器使用KID在其数据库中查找相应的密钥。一部电影最多可包含20个不同部分的不同KID。

总结

  • DRM(数字权管理)——数字内容的加密保护系统,合法流媒体播放的必要条件。
  • 三种主要方案:Widevine(Android)、FairPlay(iOS)、PlayReady(Windows)——使用CENC统一加密内容。
  • Widevine L1(通过TEE的硬件保护)支持4K HDR,L3(软件)限制50p。级别通过MediaDrm.getPropertyString检查。
  • FairPlay仅与HLS配合使用,并使用AVContentKeySession通过KSM服务器请求密钥。
  • DRM集成通过媒体播放器实现:使用DefaultDrmSessionManager的ExoPlayer(Android),使用AVContentKeySession的AVPlayer(iOS)。
  • DRM错误通过onPlayerError处理——过期的许可证、设备不兼容和网络错误占播放失败的8%。
  • 对于多平台服务,建议采用与CDN提供商配合的Multi-DRM方法,并统一使用CENC加密内容。

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读