在典型使用中,Microsoft PlayReady 通过为媒体文件提供许可证来保护内容。 无需隐藏文件、使其不可访问,或在文件从系统传输到系统时进行特殊保护。 换句话说,不需要作系统要求或高安全性的文件传输机制。 但是,如果文件受 PlayReady 保护,则复制文件并将其交给好友不会允许该好友使用该文件。 若要使用媒体文件,用户需要许可证。 此许可证是行使对内容(媒体文件)的控制的主要手段。 该许可证授予单个客户端(如媒体播放器)或域名。 许可证不会在其他客户端或其他域上运行。
每个许可证都包含权限和限制,具体定义内容的使用方式以及条件是什么。 例如,音乐文件许可证可能启用“播放权限”,但限制可以播放内容的应用程序的安全级别。 许可证可能在 2017 年 10 月 1 日至 2017 年 11 月 1 日期间有效。 单个文件可能有多个许可证。 只要其中一个许可证授予适当的权限,并且限制不会阻止访问,用户将能够访问和使用其内容。
端到端视频服务概述
下图展示了端到端视频服务的概览,包括左侧的服务后端和右侧的客户端。
在图的左侧,可以看到该服务有一些服务器来流式传输视频(内容分发网络)。 还有一些服务器允许用户浏览内容并选择他们想要播放的内容(用户界面)。 此外,还有一些服务器允许用户登录并进行身份验证,以及支付内容(身份验证、付费)。 此外,还有 PlayReady 许可证服务器。
插图的右侧是客户端。 客户端可以是 Windows 应用程序、智能手机应用程序或特定设备,例如机顶盒、网络接收器等。 其中一些客户端可能在其播放器中附带 PlayReady 集成客户端,例如,OEM 可能已在作系统或硬件中集成 PlayReady。 其他人可能会在应用商店发布的应用程序中集成客户端。 玩家可以通过多种不同的选项在客户端上集成 PlayReady。
本主题将重点介绍 PlayReady 为服务所做的工作,如下图所示。
PlayReady 提供的一种方法是客户端从服务器请求许可证的方法,然后通过开放网络传递保护受保护表单中内容的密钥。 PlayReady 执行的第二件事是向客户端提供权限和正确的限制。 借助 PlayReady,该服务能够提供内容播放密钥,但例如,仅允许客户端在租赁方案中使用该密钥两天。 因此,PlayReady 提供了一种使用密钥声明权限和权利限制的方法。
PlayReady 还提供了一种更安全的方式,将内容密钥存储在客户端上,以便客户端能够使用该客户端密钥解密用于呈现的内容,但不允许内容以明文状态保存并与其他用户共享。
为了确保 PlayReady 客户端的行为正确,PlayReady 要求硬件和软件实现遵循合规性和可靠性规则。 这些规则控制客户端在解密或处理 PlayReady 内容时必须的行为方式。 它们还要求客户端正确处理许可证中找到的限制。 因此,如果客户端收到指示使用内容密钥的时间不超过 48 小时,客户端必须遵循这些指示。 这些规则由 合规性和可靠规则中的Microsoft提供,由客户端开发人员在其客户端中强制实施这些规则。
基本加密和许可过程
以下步骤说明了内容的端到端加密和许可过程,以及 PlayReady 在此过程中的参与方式。
下图包含一个尚未加密的资产(音频/视频文件)。 用于加密内容的方法完全由内容提供程序提供,并且未作为 PlayReady 的一部分提供。
若要加密此文件,服务需要在内容加密器中使用密钥生成器来生成将用于加密内容的新内容密钥。 此内容密钥稍后将从 PlayReady 许可证服务器传送到客户端,以允许解密内容并为用户呈现。 除了内容密钥(这是一个私有值)之外,加密服务还会将密钥标识符(KeyID)(即 GUID)与内容密钥相关联。 KeyID 是一个公共值。
密钥和 KeyID 在加密时生成,存储在密钥管理系统中,通常是某类数据库。 PlayReady 不提供密钥管理系统,因此由与广播公司一起构建服务的服务或合作伙伴提供密钥管理系统。
除了将密钥和 KeyID 存储在密钥管理系统中之外,还需要将 KeyID 应用到打包程序中,然后生成标头。 此标头由服务或合作伙伴根据PlayReady 标头规范进行格式化,然后在内容文件的标头中以明文形式嵌入。
此时,音频和视频将使用 KeyID 进行加密,并且你有一个已准备好传递到客户端的加密内容文件。
现在,客户端可以开始使用内容。 客户端可能要做的第一件事是向服务验证用户身份,通常是提供登录名和密码,但用于对用户和设备进行身份验证的任何其他机制都没问题。 通常,在验证用户后,会话令牌将返回到客户端。 请注意,任何用于用户身份验证的机制,完全由服务来验证用户身份;PlayReady 不提供这项技术。
接下来,内容将传送到客户端(例如,客户端已开始下载构成内容的数据流的一部分)。 然后,客户端开始分析此内容,并发现它已加密并使用未知密钥,但包含 KeyID。
此时,客户端将向许可证服务器发送许可证获取请求。
然后,许可证服务器与身份验证服务进行交互以验证用户。 许可证服务器通常做的第一件事是验证客户端/用户是否有权获得该特定许可证。 同样,PlayReady 不提供该布局(身份验证),我们只是提供许可证服务器。 然后,身份验证服务通常会以“是”或“否”做出响应,或者可能是有条件地回答“是”(例如,此用户有权观看这部特定电影,但只能以较低质量观看,因为用户没有达到最高的订阅级别——这取决于用户每月支付的金额)。
然后,许可证服务器根据 KeyID 向存储密钥的密钥管理系统请求该密钥的值,密钥管理系统会对该请求作出响应。 只是为了重申,PlayReady 不提供密钥管理系统相关组件,因此会有一个请求从 PlayReady 许可证服务器发送到服务构建的用于存储密钥的组件。
该密钥由许可证服务器接收,许可证服务器可以传送许可证。 受保护的 PlayReady 许可证响应包括密钥的实际值以及供客户端执行的权限和权限限制列表。
尽管此演示显示 PlayReady 许可证服务器仅传送一个密钥,但许可证服务器可以在一个许可证响应中传送一组许可证。 多个许可证可以包含在一个事务中,如果内容受到多个密钥的保护,或者服务想要提前传递多个密钥,则每个许可证都提供一个密钥,例如,服务知道用户将连续侦听八个曲目。
PlayReady 提供的另一项技术是将密钥和权限存储在客户端中(称为许可证存储)的方法。
许可证存储通常称为 HDS,因为许可证存储的结构是 哈希数据存储。 设备上可以有多个类型的许可证存储 - 一个应用程序可以包含自己的 HDS,只是为了确保一家公司的 HDS 与另一家公司的 HDS 不在同一文件中。 完全由客户端开发人员做出此设计选择。 例如,在 Windows 上使用 PlayReady,Microsoft 选择每个网站为 Internet Explorer 和 Microsoft Edge 各设一个 HDS,并且为每个 Windows 通用应用单独设置一个 HDS。
HDS 可以持久方式存储,例如在设备的硬盘驱动器或永久性内存上,也可以以非持久性方式(如非持久性内存中)存储。 因此,当许可证服务器颁发许可证时,它可以设置许可证的属性,指示许可证不应存储在客户端的硬盘驱动器上,或者在机顶盒或手机中,它不应存储在永存内存中,因为作为服务,你不希望将许可证存储在永存内存中。 在这种情况下,只需将 HDS 存储在播放器应用程序的上下文中,这样一旦用户关闭播放器应用程序,许可证及其权限就会消失。