由 PlayReady 保护的每个媒体文件都有一个 PlayReady 对象 (PRO),其中包含 PlayReady 所需的多条信息。 这位于文件 的内容标头 中,例如,它可能包含视频和音频轨道的元数据。
在每个 PRO 中包含一个 PlayReady 标头,它为客户端提供所需的信息,以便查找或获取存储内容片段的许可证。 PlayReady 标头如下所示:
<WRMHEADER xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader" version="4.2.0.0">
<DATA>
<PROTECTINFO>
<KIDS>
<KID ALGID="AESCTR" CHECKSUM="xNvWVxoWk04=" VALUE="0IbHou/5s0yzM80yOkKEpQ=="></KID>
<KID ALGID="AESCTR" CHECKSUM="GnKaQIRacPU=" VALUE="/qgG2xbs4k2SKCxx6bhWqw=="></KID>
</KIDS>
</PROTECTINFO>
<LA_URL>https://test.playready.microsoft.com/service/rightsmanager.asmx</LA_URL>
</DATA>
</WRMHEADER>
我们感兴趣的部分是 <KIDS>
元素,它包含一个或多个 <KID>
元素。 KID(密钥 ID)包含客户端用于请求服务器获取相应密钥的全局唯一标识符(GUID),以及随后用于解密文件的 ALGID。 KID 是公共的,因为它包含在 PRO 中,但密钥本身是服务的机密,密钥与 KID 之间的关系仅对服务所知。
生成密钥并加密内容
PlayReady 系统中的内容加密密钥是 AES-128 CTR 和 AES-128 CBC 密钥。 加密内容的服务将生成新的 KID 和新内容密钥。 将 KID 插入 PRO 中,使用内容密钥对内容的视频和音频帧进行加密。 下图显示了如何生成密钥,然后用于加密内容。
有两种方法可以生成 KID 和密钥,包括:
- 使用 密钥管理系统 (KMS),服务会随机生成每个 KID 和密钥值并存储它们,并且只需查找客户端提供的 KID 对应的密钥值。
- 使用 PlayReady 密钥种子机制。 借助此机制,服务将确定一个名为密钥种子(30 字节随机值)的常量值,并且对于需要密钥的每个内容片段,将生成一个随机 KID。 使用服务器 SDK,可以通过提供密钥的 128 位或密钥种子和 KID 来生成密钥。 密钥将由 此处指定的 PlayReady 算法推断。
无论如何生成密钥,都必须能够验证它是否对应于正确的 KID,然后加密内容。
为内容提供许可证
当客户端发出许可证请求时,它将内容的 PlayReady 标头发送到许可证颁发者。 许可证颁发者使用上述方法之一提取 KID 并确定相应的密钥值-如果它使用密钥种子机制,则仅基于 KID 和密钥种子重新生成密钥。 然后,它会生成包含此密钥的许可证,该密钥会在 许可证响应中发送回客户端。
例如,假设你有一个视频文件。 此内容的打包程序生成一个随机 KID 123
,它会将其插入到文件的 PlayReady 标头中。 打包程序还会生成一个随机键值 ABC
来与 KID 123
对应,并将它们存储在 KMS 中。 打包程序要求 KMS 使用正确的密钥加密文件,并使用密钥 ABC
加密文件。 当客户尝试播放文件时,客户端会向许可证颁发者询问与 KID 123
对应的许可证。 许可证颁发者在 KMS 中查找 KID,并使用包含密钥 ABC
的许可证进行响应,使客户端能够解锁文件,客户可以监视它。
注释
许可证颁发者向客户端发送的许可证(在本示例中,包含密钥 ABC
的许可证)已加密;攻击者无法截获密钥值。
用于保护媒体文件和许可证中的密钥的密钥相同;因此,内容打包程序和许可证颁发者必须能够检索或生成指定媒体文件完全相同的密钥。 若要实现此目的,如果使用密钥种子生成密钥,则必须在内容打包程序与许可证颁发者之间共享它。
在文件或音轨之间共享密钥
正如真正的密钥可以解锁多个门一样,在技术上,可以使用一个 PlayReady 密钥解锁一个文件中的多个曲目,甚至是一组资产中的多个文件。 在打包过程中,内容打包程序可以为多个曲目或多个媒体文件指定相同的密钥标识符,并且相同的密钥将全部用于它们。
例如,如果多质量的视频资产具有 4K、HD 和 SD 视频曲目和多个音频轨,加密器可以灵活地为每个曲目定义一个密钥,或为所有曲目定义一个密钥。
客户端需要他们有权解密的每个密钥的许可证。 请注意,传送多个许可证可由许可证服务器在单个许可证响应中完成。
在包含多个音轨的单一资产中,是否为所有音轨使用一个密钥还是为每个音轨使用独立密钥的决策由管理该内容的服务决定,并基于以下标准:
- 更多的密钥会增加复杂性,但允许你在许可证交付时指定服务希望允许特定客户端解密的音轨。
- 密钥越少,复杂性越低,但这不允许您在许可证交付时指定服务希望允许特定客户端解密哪些轨道。
- 某些客户端可能有限制,即它们不支持单个资产的多个密钥。
注释
虽然 PlayReady 密钥可以解锁多个数字媒体文件,但Microsoft对此非常反对。 在所有文件中使用唯一密钥比保护具有相同密钥的文件更安全。
在许可证响应中堆叠许可证
单个许可证响应还可以包含多个许可证,因此可以在一次交易中使用多个密钥解锁多个文件或轨道。 这比为多个许可证创建多个响应更有效,因为它只涉及一个事务。 这可用于不同的方案:
- 使用多个密钥对一个媒体文件进行加密。 例如,视频曲目使用 Key1 进行加密,并且音频曲目使用 Key2 进行加密。 当客户端请求 KID1 许可证时,许可证服务器会发出许可证响应,包括 KID1 和 KID2 的许可证,因此客户端具有解密文件的视频和音频轨迹的所有密钥。
- 专辑中的每个歌曲都使用不同的密钥进行加密,但客户已获得所有歌曲的权限。 当客户开始播放第一首歌曲时,许可证服务器会发出许可证响应,包括专辑中每个歌曲的一个许可证,因此客户端具有无缝播放整个专辑所需的所有密钥。
- 电视直播频道的密钥预计每24小时变化一次。 播放开始时,服务器会发送许可证响应,包括当前密钥的许可证,但也发送具有下一个密钥的许可证,因此当密钥发生更改时,客户端将拥有下一个密钥,并且更改会无缝进行。