DRM(数字权管理)——是一套保护数字内容免受未经授权复制和传播的技术。在移动应用中,DRM用于加密视频、音频和电子书,确保版权所有者与消费者之间的许可协议得到遵守。据Google Widevine Documentation, 2026,DRM嵌入了多数流媒体服务——Netflix、Spotify、Apple TV+——并且是合法发行高级内容的必要条件。
核心要点
DRM——是一组控制对数字内容访问的加密和软件方法。与简单加密不同,DRM包括许可证系统:内容被加密,需要经过用户权限检查后才会发放密钥才能观看。
DRM的主要任务是防止盗版并确保区域限制得到遵守。没有DRM,内容所有者(电影制片厂、录音公司)不会将其内容授权给流媒体平台。据Motion Picture Association (2025)报告,与DVD抽取时代相比,使用DRM使得电影在流媒体中的非法传播减少了62%。
在移动开发中,DRM嵌入在媒体播放器层面:开发者使用ExoPlayer(Android)、AVPlayer(iOS)或Shaka Player(Web),它们支持对加密流的内置解密。开发者无需实现加密算法——只需集成用于授权的SDK即可。
CENC(共同加密——ISO/IEC 23001-7)标准允许所有DRM系统使用单一加密媒体文件。内容被加密一次,密钥通过不同的授权服务器分发。这对于多平台服务至关重要:Netflix将电影加密一次,并无需重新编码即可将其提供给Android(Widevine)、iOS(FairPlay)和Windows(PlayReady)。
CENC使用对音频和视频轨道使用不同密钥的CBC加密。每个密钥以加密形式存储在MPD(MPEG-DASH)或M3U8(HLS)的清单中。内容标识符(KID)将加密流与服务器上的许可证关联起来——没有有效的许可证,密钥将无法解密。
DRM播放过程由四个阶段组成:加载清单、获取许可证、解密内容和显示。每个阶段由系统的不同组件执行——媒体播放器、CDM模块和授权服务器。
CDM——是一个受保护的软件或硬件模块,用于执行内容解密。在Android上,CDM在MediaDrmAPI层面实现;在iOS上,通过AVContentKeySession嵌入到AVFoundation中。CDM从不向应用程序泄露密钥——所有加密操作都在受保护环境(TEE——可信执行环境)内执行。
在具有硬件支持(Secure Level 1)的设备上,CDM在TEE内工作——密钥从不进入设备主内存。这是制片厂对以4K HDR播放内容的要求。在没有TEE的设备上,密钥通过软件方式解密(L3),这降低了保护程度并且将最高质量限制在540p。
在移动平台上,三个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 |
对于在所有平台上都能工作的流媒体服务,需要支持所有三种DRM。实用的解决方案是使用具有多DRM支持的CDN(Muvi、Vualto、Axinom),它们会根据用户的设备自动将授权请求路由到相应的服务器。据Streaming Learning Center (2025)报告,78%的流媒体服务使用Multi-DRM方法。
带有CENC的MPEG-DASH标准简化了架构:内容使用共享密钥加密一次,而DRM系统在客户端选择。授权服务器接收到带有设备标识符的请求,并返回针对特定CDM加密的密钥。不同平台的内容没有区别——只是授权服务器不同。
Widevine——Google的DRM系统,是Android上事实上的标准。它支持三个安全级别,决定内容解密的地点和方式。安全级别取决于设备的硬件能力,并决定内容的最高分辨率。
Widevine L1(硬件)——最安全的级别。所有加密操作都在可信执行环境(TEE)内执行。密钥从不离开受保护的区域。具有L1的设备可以播放最高4K HDR的内容。需要Google认证——这是旗舰设备经历的一个程序。
Widevine L3(软件)——解密发生在设备的主内存中。密钥可能被技术熟练的攻击者抽取。高级内容的分辨率限制为540p(960x540)。所有Android设备都支持L3,即使它们没有获得L1认证。
Widevine L2——一个稀有的中间级别,解密在TEE中进行,但渲染通过未受保护路径。使用于某些智能电视。在移动设备上几乎不会出现。
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流媒体播放)协议配合工作。内容被打包成.ts(MPEG-TS)片段或.m4s(fMP4)片段。M3U8清单包含#EXT-X-KEY标签,具有授权服务器(KSM——密钥服务器模块)的URI和初始化IV。开始播放时,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。密钥保存在键锩中,并可在重复观看时无需访问服务器即可使用。但是,离线许可证的有效期有限——通常为7–30天,此后需要更新。
离线许可证存储在iOS的受保护存储中——键锩。在尝试攻击(越犱、提取内存转储)时,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原生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。
使用Multi-DRM:Widevine用于Android、FairPlay用于Apple、PlayReady用于Windows。Axinom或Vualto等服务为所有三种DRM提供统一API。内容通过CENC加密一次,DRM选择在客户端自动进行。
在iOS上,通过AVContentKeySession使用FairPlay的持久密钥。在Android上,通过ExoPlayer OfflineLicenseHelper使用Widevine离线许可证。密钥本地保存在Keychain(iOS)或KeyStore(Android)中,有效期有限——通常为7到30天。
KID(密钥标识符)——是CENC清单中加密密钥的唯一的16字节标识符。每个KID与特定的内容片段(例如电影的10分钟片段)相关联。授权服务器使用KID在其数据库中查找相应的密钥。一部电影最多可包含20个不同部分的不同KID。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。