PlayReady 内容加密模式
本主题概述了 PlayReady 系统中的内容加密模式。 有关 PlayReady 和内容加密的概述,请参阅 PlayReady 内容加密。 有关加密术语和定义,请参阅 术语表 。
除了以前在 WMDRM (Windows Media Digital Rights Management) 中使用的特定于 Microsoft 的 COCKTAIL 加密模式外,PlayReady 版本 1.0 还引入了 AES-128 CTR 内容加密模式。 AES-128 CTR 内容加密模式使用 AES 密钥,在计数器模式下的内容文件上使用的长度为 128 位, (CTR) 。
从版本 4.0 开始,PlayReady 系统在计数器模式 (CTR) 和密码块链接模式 (CBC) 支持 AES 128 位密钥。
此更改可确保使用 PlayReady 的服务可以充分利用所有设备中唯一的流和文件格式。 此外,Microsoft支持 ISO/IEC FDIS 23000-19 中定义的 CMAF (通用媒体应用程序格式) 标准。
常见加密模式
ISO 标准 ISO/IEC 23001-7 定义了四种常见加密模式。
从版本 4.0 开始的 PlayReady 客户端除了支持通用加密模式“cenc”的 AES CTR 密钥外,还支持通用加密模式“cbcs”的 AES CBC 密钥。 在版本 4.0 之前,AES CTR 是 PlayReady 客户端主要支持的模式,它允许支持通用加密模式“cenc”。 请注意,通用加密模式“cens”和“cbc1”在 PlayReady 生态系统中是允许的,在技术上是可行的,但不受支持。
支持“cbcs”AES-CBC 加密方案
在 PlayReady PK 版本 4.0 上或之后构建的所有客户端都可能支持 CBC 密钥。 不过,客户端支持是可选的,并通过许可证获取协议中的附加属性向许可证服务器发出信号。
版本 | 鸡尾酒 | “cenc” | 'cbcs' |
---|---|---|---|
PlayReady 客户端 1.0 | 受支持 | 受支持 | 不支持 |
PlayReady 客户端 2.0 | 受支持 | 受支持 | 不支持 |
PlayReady 客户端 2.5 | 受支持 | 受支持 | 不支持 |
PlayReady 客户端 3.0 | 不支持 | 受支持 | 不支持 |
PlayReady 客户端 3.3 | 不支持 | 受支持 | 不支持 |
PlayReady 客户端 4.0 | 不支持 | 受支持 | 受支持 |
注意
- 使用版本 1709 或更高版本升级的所有 Xbox One 单元都支持“cbcs”。
- 从版本 4.0 开始的所有 PlayReady 许可证服务器都支持使用 CBC 密钥颁发许可证。
在 PlayReady 标头中向 ALGID 发出信号
PlayReady 标头是通常包含在内容文件或流的标头中的 XML 文档。 它描述了客户端解密此内容所需的 PlayReady 属性。 PlayReady 标头有自己的规范和版本控制。 有关详细信息,请参阅 PlayReady 标头规范。
版本 | PlayReady 标头 4.3 | PlayReady 标头 4.2 | PlayReady 标头 4.1 | PlayReady 标头 4.0 |
---|---|---|---|---|
PlayReady 客户端 4.0 (请参阅注释 4) |
✔ | ✔ | ✔ | ✔ |
PlayReady 客户端 3.3 (请参阅注释 3) |
✔ | ✔ | ✔ | |
PlayReady 客户端 3.0 (请参阅注释 3) |
✔ | ✔ | ✔ | |
PlayReady 客户端 2.5 (请参阅注释 2) |
✔ | ✔ | ||
PlayReady 客户端 2.0 (请参阅注释 2) |
✔ | ✔ | ||
PlayReady 客户端 1.0 (请参阅注释 1) |
✔ |
注意
- (4) Xbox One 版本 1709 或更高版本是 PlayReady 4.X 客户端。
- (3) Windows 10所有版本和 Xbox One 版本 1703 或更低版本都是 PlayReady 3.X 客户端。 2017 年以后发布的最新非 Windows 设备 (例如智能电视) 是 PlayReady 3.X 客户端。
- (2) Silverlight 和 Windows 8,8.1 是 PlayReady 2.X 客户端。 大多数非 Windows 设备 (例如,2011 年至 2017 年间发布的智能电视) 都是 PlayReady 2.X 客户端。
- (1) 大多数非 Windows 设备 (例如,2008 年至 2011 年间发布的智能电视) 是 PlayReady 1.X 客户端。
下面是 PlayReady 标头 v4.2 的示例。
<WRMHEADER
version="4.2.0.0"
xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader">
<DATA>
<PROTECTINFO>
<KIDS>
<KID ALGID="AESCTR" CHECKSUM="xNvWVxoWk04=" VALUE="0IbHou/5s0yzM80yOkKEpQ=="></KID>
<KID ALGID="AESCTR" CHECKSUM="GnKaQIRacPU=" VALUE="/qgG2xbs4k2SKCxx6bhWqw=="></KID>
</KIDS>
</PROTECTINFO>
<LA_URL>http://rm.contoso.com/rightsmanager.asmx</LA_URL>
<DS_ID>AH+03juKbUGbHl1V/QIwRA==</DS_ID>
<DECRYPTORSETUP>ONDEMAND</DECRYPTORSETUP>
</DATA>
</WRMHEADER>
ALGID (算法标识符) 是 KID 元素的属性,指定用于加密内容的加密算法。 从 PlayReady 标头版本 4.2 开始,ALGID 是必需的,并且必须设置为“AESCTR”或“COCKTAIL”。 但是,从版本 4.3 开始,ALGID 也可以设置为值“AESCBC”。 以下示例演示了一个 PlayReady 标头版本 4.3,其中 ALGID 值设置为“AESCBC”。
<WRMHEADER
version="4.3.0.0"
xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader">
<DATA>
<PROTECTINFO>
<KIDS>
<KID VALUE="PV1LM/VEVk+kEOB8qqcWDg==" ALGID="AESCBC"/>
<KID VALUE="tuhDoKUN7EyxDPtMRNmhyA==" ALGID="AESCBC"/>
</KIDS>
</PROTECTINFO>
<LA_URL>http://rm.contoso.com/rightsmanager.asmx</LA_URL>
<DS_ID>AH+03juKbUGbHl1V/QIwRA==</DS_ID>
<DECRYPTORSETUP>ONDEMAND</DECRYPTORSETUP>
</DATA>
</WRMHEADER>
下图显示了一个内容流,其中许可证请求基于 PlayReady 标头并指定了 ALGID。
缺少 ALGID
从 PlayReady 标头版本 4.3 开始,ALGID 可能缺失。 以下示例演示缺少 ALGID 值的 PlayReady 标头版本 4.3。
<WRMHEADER
version="4.3.0.0"
xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader">
<DATA>
<PROTECTINFO>
<KIDS>
<KID VALUE="PV1LM/VEVk+kEOB8qqcWDg=="/>
</KIDS>
</PROTECTINFO>
<LA_URL>http://rm.contoso.com/rightsmanager.asmx</LA_URL>
<DS_ID>AH+03juKbUGbHl1V/QIwRA==</DS_ID>
<DECRYPTORSETUP>ONDEMAND</DECRYPTORSETUP>
</DATA>
</WRMHEADER>
下图显示了一个内容流,其中许可证请求使用 CDMi 模块,并且缺少 ALGID。
注意
每个 PlayReady 标头可能具有:
- 只有一种加密类型。 例如,如果 ALGID=“AESCTR”,则标头的所有键都在 CTR 模式下使用。 当 ALGID=“AESCBC”时,此标头的所有键都在 CBC 模式下使用。
- 当 ALGID 缺失时,此标头的所有键都在计数器模式或密码块链接中使用,但该值不会插入标头中。
- 向 v4.0 以下的许可证服务器发出具有 PlayReady 标头 v4.3 的许可证获取请求将引发异常。
- 许可证响应可以包含一个或多个许可证,其中每个许可证包含一个密钥和任意数量的策略。
为什么缺少 ALGID 值
Microsoft建议加密程序始终在 PlayReady 标头中包含与处理内容时相同的 ALGID 值。
在标准方案中,加密器会加密内容并在内容中生成 PlayReady 标头。 加密程序知道用于加密的 AES 模式;因此,它将此信息包含在 PlayReady 标头的 ALGID 属性中。 客户端基于从实际内容中分析出来的 PlayReady 标头启动许可证请求,因此 ALGID 值存在且有效。
在某些情况下,客户端基于简单的 KID 值 (128 位 GUID) 启动许可证请求。 在这种情况下,将缺少许可证请求中插入的 PlayReady 标头中的 ALGID 值, (也称为未指定的) 。 一个示例是客户端使用 HTML5 EME API 发出许可证请求。
客户端如何处理缺少的 ALGID
如果客户端基于传入的 PlayReady 标头发起许可证请求,则许可证请求中的 ALGID 值将反映标头中的值,因为许可证获取质询包括 PlayReady 标头的副本。 在这种情况下:
- 对于所有 PlayReady 标头 v4.2 或更低版本,ALGID 值是必需的,并且必须有效。
- 对于 PlayReady 标头 v4.3 或更高版本,ALGID 值可能存在且有效,也可能缺失。
服务器 SDK 如何处理缺少的 ALGID
通过许可证响应传递的所有许可证都必须包含有效的 ALGID 值。
如果在传入的许可证请求中未指定 ALGID,则许可证服务器必须从服务的后端获取此信息,并在许可证响应中放置正确的值。
初始化向量 (IV)
在 PlayReady 版本 3.3 及更早版本中,CTR 模式下仅支持 64 位 IV (8 字节 IV) 。 从 PlayReady 版本 4.0 开始,CTR 和 CBC 模式都支持 64 位和 128 位 (8 字节和 16 字节的 IV) 。
示例:
- 现在支持在 CBC 模式下频繁使用 128 位 IV 的符合 HLS 的流。
- 现在支持在 CTR 模式下使用 128 位 IV 的某些 HbbTV 一致性流。
限制
- 对于所有 KID 元素,PlayReady 标头只能使用一个 ALGID 值。 换句话说,用于加密资产的不同轨迹和质量的所有密钥都必须是 AES CTR 或 AES CBC。 如果任何 KID 元素上缺少 ALGID,则必须从所有 KID 元素中缺少 ALGID。
- 在 PlayReady 版本 4.4 之前,当传入的客户端证书为 Windows 且 SL2000 时,生成具有 CBC 密钥的许可证会引发异常。 这是因为 Windows 客户端仅在 SL3000 单元上支持 CBC。 但是,如果此客户端最低版本为 PlayReady 版本 4.0 并声明支持 CBC 模式,则有可能将具有 CBC 密钥的许可证传送给 SL2000 客户端。
- 当传入客户端证书是使用 4.0 之前的移植工具包版本的设备时,使用 CBC 密钥生成许可证将引发异常。
- 当传入的许可证请求未指示支持 AES CBC 时,使用 CBC 密钥生成许可证将引发异常。
重要
服务不得使用相同的 {KID, Ck} 在 CTR 模式和 CBC 模式下加密单个内容。
- 出于功能原因,获取 {KID, Ck, AESCTR} 和 {KID, Ck, AESCBC} 许可证的客户端将不起作用。
- 出于可靠性原因,攻击者如果有权访问在 CBC 和 CTR 模式下使用相同密钥加密的相同内容,则无需授权即可更轻松地解密内容。