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 的内容流

缺少 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。

缺少 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 模式下使用相同密钥加密的相同内容,则无需授权即可更轻松地解密内容。