第 8 章 · DRM 版权保护
为什么 Netflix 不能被录屏
Widevine / FairPlay / PlayReady · CENC · License · L1/L2/L3 · 轻量保护
本章你会理解:Widevine / FairPlay / PlayReady 是什么、一次加密三家通吃是怎么做到的、License 流程、L1/L2/L3 级别为什么决定你能不能看 4K、短视频/短剧常用的轻量保护手段。
预计阅读时间:22 分钟
1
8.1 为什么视频需要"加密 + 许可"
假设你花 $50 买下 Netflix 一个月。Netflix 要保证:
• 只有你可以看(不能复制给朋友)
• 只能在有限时间内看(月费到期就不能看)
• 只能在授权设备上看(不能导出到一个"播放器外壳"疯狂传播)
• 高清 4K 只给安全设备(防止有人破解后把 4K 视频泄露全网)
这就是 DRM(Digital Rights Management,数字版权管理) 要做的事。
DRM 的核心思路:
1. 加密视频内容(用一个密钥 CEK 加密每个切片)
2. 密钥分发给播放器要经过严格校验(你是谁?订阅了吗?设备靠谱吗?)
3. 密钥永远不暴露给 APP 层,只存在硬件安全区内
类比:视频就像一本加密的书。书本身(加密切片)可以随便复制,但读书用的钥匙(CEK)发放时要检查证件,且钥匙只在"密室"(硬件安全区 TEE)里使用,永远不会出门。
2
8.2 区分三个"都叫加密"的东西
新手最容易混淆:
| 名称 |
能叫 DRM 吗 |
强度 |
| HTTPS / TLS |
否 — 只是传输加密 |
抓包能绕过 |
| HLS AES-128 |
否 — 轻量加密 |
key URL 泄漏即失效 |
| HLS SAMPLE-AES + FairPlay |
FairPlay DRM |
强 |
| CMAF + CENC + Widevine/FairPlay/PlayReady |
真正的 DRM |
强 |
3
8.3 HLS AES-128(轻量加密)
这是 HLS 规范里自带的简单加密机制:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:6
#EXT-X-KEY:METHOD=AES-128,URI="https://api.example.com/key?ep=123",IV=0x1234...
#EXTINF:6.000,
seg_00001.ts
#EXTINF:6.000,
seg_00002.ts
...
工作流程:
1. 切片用 AES-128-CBC 全量加密
2. Key URL 里下发 16 字节 AES 密钥
3. 播放器解密后播放
优点:
• 简单,任何播放器基本都支持
• 不需要接 DRM License Server
缺点:
• Key 以明文形式在 JS 层可见(Web 端)
• 抓包就能拿到 key
• 不能阻止录屏、不能阻止用户用抓包工具下载
适合场景: 防"非付费用户直接盗链",配合 Signed URL + Token 使用,增加门槛。
不适合: Netflix 这种有真金白银版权的大厂;对防盗录有需求的高价值内容。
4
8.4 "真 DRM" 三巨头
| DRM |
厂商 |
覆盖平台 |
| Widevine |
Google |
Android、ChromeOS、Chrome、Firefox、Edge、大部分智能电视 |
| FairPlay Streaming (FPS) |
Apple |
iOS、iPadOS、macOS (Safari)、tvOS |
| PlayReady |
Microsoft |
Windows、Xbox、Edge、部分智能电视 |
问题来了:同一部电影要给 iPhone 和 Android 同时看,需要两套加密、两套 key,还要在两个 License Server 上配?
答案是:不用。有个东西叫 CENC 解决了这个问题。
5
8.5 CENC:一次加密、三家通吃
CENC(Common Encryption),ISO/IEC 23001-7 国际标准。
核心贡献:定义统一的加密格式,让 Widevine、FairPlay、PlayReady 的播放器都能解同一份加密文件。
两种 CENC 模式
| 模式 |
算法 |
特点 |
DRM 支持 |
| cenc |
AES-128 CTR |
精确加密 |
Widevine、PlayReady(经典) |
| cbcs |
AES-128 CBC + Pattern |
带 pattern 加密、硬件解码友好 |
FairPlay(必须)、Widevine(现代)、PlayReady(现代) |
结论:用 cbcs 模式一次加密,Widevine + FairPlay + PlayReady 三家通吃。这就是现代 CMAF + CBCS 的黄金组合。
6
8.6 DRM 的完整工作流
一次带 DRM 的播放过程:
Packager Key Store
(加密切片) KID + CEK (密钥库/KMS)
| ^
| 加密后的切片 |
v |
CDN License Server
| ^
| 1. fetch manifest |
| 2. fetch encrypted segment |
v 4. license 请求
+-----------------+ |
| Player | |
| +----------+ | |
| | CDM |--+--- 3. challenge ---+
| | (黑盒) |<-+--- 5. license + CEK
| | 在 TEE 里 | |
| | 解密播放 | |
| +----------+ |
+-----------------+
关键概念
| 术语 |
含义 |
| KID(Key ID) |
每个切片对应一个 key id |
| CEK(Content Encryption Key) |
加密切片的 16 字节 AES 密钥 |
| CDM(Content Decryption Module) |
播放器里的 DRM 组件,操作在硬件安全区(TEE)中 |
| License |
服务器下发给 CDM 的东西,里面包含加密后的 CEK + 使用规则 |
逐步解释
1. 打包阶段:Packager 从 Key Store 要 KID 和 CEK,加密每个切片,把 KID 和 PSSH(Protection System Specific Header)写进 manifest。
2. 播放阶段:
• Player 加载 manifest → 发现有 DRM → 初始化 CDM
• CDM 生成一个 challenge(请求消息,包含设备指纹、公钥等)
• Player 把 challenge 发给 License Server(业务接口)
• License Server 校验:"这个用户订了吗?这个设备安全级别够吗?"
• 合格 → 返回 license(里面的 CEK 用 CDM 的公钥加密)
• CDM 在 TEE 里解密 license → 用 CEK 解密切片 → 直接给 GPU 渲染
CEK 全程不进内存、不进 JavaScript。这是 DRM 的根本安全保证。
7
8.7 Widevine 的 L1 / L2 / L3
Widevine 把设备分三个安全级别:
| 等级 |
视频解密位置 |
解码位置 |
安全性 |
最高画质 |
| L1 |
TEE(硬件安全区) |
TEE |
最高 |
4K / HDR |
| L2 |
TEE |
软件 |
中 |
1080p 上限 |
| L3 |
软件(app 层) |
软件 |
最低 |
480p / 720p 上限 |
为什么 4K 只给 L1?
Netflix 4K 流有 $1M+ 的版权价值。如果 L3 设备能解 4K,攻击者用虚拟机 + 逆向就能把 4K 源保存下来泄露到盗版网站。
Netflix、Disney+ 在 License Server 校验 securityLevel >= L1 才下发 4K 的 key。
如何检查设备 Widevine 级别?
• Android:用 drm_info APP 查看
• Chrome:chrome://settings/content/protectedContent → 看证书
很多主流 Android 旗舰(三星 S 系、小米 Pro 版、Pixel)是 L1;中低端很多是 L3。
FairPlay 没有等级
Apple 不像 Widevine 分级。所有苹果设备统一用 Secure Enclave 保护,实质等同于 L1。
PlayReady 有 SL150 / SL2000 / SL3000
类似 Widevine 的分级:
• SL150:软件级别,对应 L3
• SL2000:主流硬件级别,对应 L2
• SL3000:最高硬件级别,对应 L1
8
8.8 HDCP:你的 HDMI 线也被检查了
HDCP(High-bandwidth Digital Content Protection):HDMI/DisplayPort 链路上的保护协议。
当你用 iPad 外接 HDMI 到电视放 Netflix,这条链路要协商 HDCP。如果:
• 你的 HDMI 线太老(只支持 HDCP 1.4)→ Netflix 可能只给 1080p
• 线和显示器都支持 HDCP 2.2 → 可以给 4K
License Server 常强制 requireHdcp: "2.2",否则拒绝下发 key。
一个常见坑:测试环境用 HDMI 采集卡录视频发现"黑屏"——因为采集卡不支持 HDCP 合规协议,link 被切断。这是 DRM 在起作用。
9
8.9 License Server 在做什么
License Server 是业务自己搭(或买托管)。收到 challenge 后:
def handle_license_request(challenge, user_jwt):
# 1. 验证 JWT (用户身份、订阅、剧集权限)
user = verify_jwt(user_jwt)
if not user.subscribed:
return 403
# 2. 识别 challenge 是哪种 DRM (Widevine/FairPlay/PlayReady)
drm_type = detect_drm_type(challenge)
# 3. 校验设备安全级别
security_level = extract_security_level(challenge)
if video_is_4k and security_level < L1:
return 403 # 4K 不给不安全设备
# 4. 找到 CEK (按 KID)
kid = extract_kid(challenge)
cek = key_store.get(kid)
# 5. 调用 DRM 厂商的 SDK 生成 license
license_blob = drm_sdk[drm_type].generate_license(
challenge=challenge,
cek=cek,
policy={
"expires_in": 86400, # 1 天有效
"hdcp_required": "2.2", # HDMI 强制 HDCP 2.2
"allow_offline": False, # 不允许下载
"output_protection": True,
}
)
return license_blob
常见托管 SaaS:
• EZDRM
• PallyCon
• Irdeto
• BuyDRM KeyOS
• Axinom
• VdoCipher
价格:按 license 请求计费,每 1000 次约 $0.1-1。
10
8.10 SPEKE:Packager 和 Key Server 的对话协议
SPEKE(Secure Packager and Encoder Key Exchange)是 AWS 推出的标准接口,让 Packager(如 MediaPackage、Shaka Packager)用统一的方式跟不同 DRM 厂商的 Key Server 对话。
接入 SPEKE 后:
• MediaPackage 配一个 URL → 指向 EZDRM/PallyCon 的 SPEKE endpoint
• 打包时 Packager 自动向 Key Server 请求 KID + CEK
• Key Server 返回,Packager 自动生成带 DRM 的 manifest
SPEKE 是业界接入 DRM 的事实标准。配置简单,Packager 侧无需了解各 DRM 厂商的私有 API。
11
8.11 离线播放(Download to Go)
"下载到本地离线看"也要通过 DRM:
• 客户端下载加密切片到本地存储
• License Server 下发一个 persistent license(带"离线有效 48 小时"这种条款)
• CDM 把 license 存在硬件安全区
• 离线播放时用存着的 license 解密
Widevine 的 offline license、FairPlay 的 persistent license 都支持。
"下载到手机 SD 卡就能分享吗?" — 不能。密文切片没有 license 无法播放,license 又绑定设备。
12
8.12 短视频/短剧的轻量保护策略
短视频/短剧平台的内容:
• 单集价值不高(几毛到几块)
• 用户量大、License 调用开销巨大
• 多是"先看到再说"(不看就流失)
用完整 DRM 反而不划算。常见做法分三级:
L0 (免费试看段):
明文 HLS + Signed URL
(前几集)
L1 (中等保护):
HLS AES-128 + 动态 IV + Signed URL
+ 客户端 SDK 做 key 派生 + 反抓包
(绝大多数付费解锁剧集)
L2 (高):
完整 Multi-DRM (CBCS + Widevine + FairPlay)
(顶级独家爆款)
常见辅助保护
1. Signed URL + Token 绑定用户 / 订单
2. Key Rotation:每 N 秒换一次 key,提高破解成本
3. 客户端 SDK 内嵌 key 派生逻辑:攻击者要逆向 SDK 才能提取
4. 反录屏:
• iOS:UIScreen.isCaptured 检测,AirPlay 强制降清晰度
• Android:FLAG_SECURE 禁止录屏截屏
5. 反调试 / 反越狱:检测 Frida、root、LLDB
6. 动态水印:左下角小字叠 user_id + 时间戳,泄漏溯源
7. Private Encryption:云厂商(BytePlus、阿里云、腾讯云)的私有加密方案,CDN 边缘解密
13
8.13 选择建议
你的内容是什么?
|
+-- 好莱坞大片 / 独家精品长视频
| -> 完整 Multi-DRM (CBCS + Widevine L1 + FairPlay + PlayReady SL3000)
| -> License Server 强制 HDCP 2.2、securityLevel=L1(4K)
|
+-- 普通 VOD 视频(B 级电影、纪录片、教学)
| -> Widevine L3 + FairPlay + PlayReady(硬件等级可放宽)
|
+-- 付费短剧 / 中低价值付费视频
| -> HLS AES-128 + Signed URL + 反录屏
| -> 客户端 SDK 做 key 派生
|
+-- 用户付费订阅下的自制内容
| -> 按版权方要求灵活(多半 DRM + 水印)
|
+-- 免费视频 / UGC
-> 不加密,用 Signed URL 防盗链即可
14
8.14 动手:用 Shaka Packager 做 DRM 打包
动手试一试。Shaka Packager 是 Google 开源的 DRM 打包工具。
生成 Widevine + FairPlay(CBCS 模式)
packager \
in=video.mp4,stream=video,init_segment=v/init.mp4,segment_template=v/seg_$Number$.m4s \
in=audio.mp4,stream=audio,init_segment=a/init.mp4,segment_template=a/seg_$Number$.m4s \
--protection_scheme cbcs \
--enable_raw_key_encryption \
--keys label=VIDEO:key_id=31323334...:key=32333435...,\
label=AUDIO:key_id=31323334...:key=32333435... \
--protection_systems Widevine,FairPlay \
--hls_master_playlist_output master.m3u8 \
--mpd_output manifest.mpd
生产环境不会硬写 key,会接 SPEKE endpoint:
packager \
... \
--key_server_url https://speke.ezdrm.com/v2 \
--content_id 'my-video-123' \
--protection_systems Widevine,FairPlay,PlayReady \
...
本章要点回顾
1. DRM = 内容加密 + 严格 key 分发 + 硬件级解密保护。
2. HLS AES-128 不是真 DRM,只是轻量加密。
3. 三大 DRM:Widevine(Google)、FairPlay(Apple)、PlayReady(微软)。
4. CENC(CBCS 模式) 让一份 CMAF 文件三家 DRM 通吃。
5. Widevine L1 = 4K 通行证;L3 最多给到 720p。
6. HDCP 2.2 是 4K 外接显示器的前置条件。
7. 短剧/短视频一般用 轻量加密 + 反录屏,而不是真 DRM。
8. 生产环境用 SPEKE 接 EZDRM / PallyCon 等托管服务。
© 2026 Zmead · VOD 流媒体技术全解