密钥和密钥 ID (KID)
由 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小时改变一次。 开始播放时,服务器发送许可证响应,包括当前密钥的许可证,但也发送具有下一个密钥的许可证,因此当密钥发生更改时,客户端将拥有下一个密钥,并且更改会无缝发生。