本主題提供 PlayReady 系統中內容加密模式的概觀。 如需 PlayReady 和內容加密的概觀,請參閱 PlayReady 內容加密。 如需加密相關詞彙,請參閱 詞彙表。
PlayReady 1.0 版引進了 AES-128 CTR 內容加密模式,除了先前用於 WMDRM (Windows Media Digital Rights Management) 的Microsoft特定 COCKTAIL 加密模式之外。 AES-128 CTR 內容加密模式使用 AES 金鑰,在計數器模式中的內容檔案上使用的長度為 128 位。
從 4.0 版開始,PlayReady 系統同時支援計數器模式 (CTR) 和加密區塊鏈結模式 (CBC) 中的 AES 128 位密鑰。
這項變更可確保使用 PlayReady 的服務可以充分利用所有裝置上唯一的數據流和檔格式。 此外,Microsoft支援 CMAF(通用媒體應用格式)標準,如 ISO/IEC FDIS 23000-19 中所定義。
一般加密模式
ISO 標準 ISO/IEC 23001-7 定義四種常見加密模式。
PlayReady 用戶端從 4.0 版開始支援 AES CBC 金鑰,除了一般加密模式 'cenc' 的 AES CTR 密鑰之外,還允許支援通用加密模式 'cbcs'。 在 4.0 版之前,AES CTR 是 PlayReady 用戶端主要支援的模式,可支援通用加密模式 'cenc'。 請注意,一般加密模式 'cens' 和 'cbc1' 在 PlayReady 生態系統中是允許且技術上可行的,但不受支援。
支援 「cbcs」AES-CBC 加密配置
所有建置在 PlayReady PK 4.0 版或之後的用戶端都可能支援 CBC 密鑰。 不過,用戶端支援是選擇性的,並透過授權取得通訊協定中的其他屬性向授權伺服器發出訊號。
| 版本 | 雞尾酒 | 'cenc' | cbc系統 |
|---|---|---|---|
| PlayReady Client 1.0 | 支援 | 支援 | 不支援 |
| PlayReady Client 2.0 | 支援 | 支援 | 不支援 |
| PlayReady Client 2.5 | 支援 | 支援 | 不支援 |
| PlayReady Client 3.0 | 不支援 | 支援 | 不支援 |
| PlayReady Client 3.3 | 不支援 | 支援 | 不支援 |
| PlayReady Client 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 Client 4.0 (請參閱附註 4) |
✔ | ✔ | ✔ | ✔ |
| PlayReady Client 3.3 (見附注 3) |
✔ | ✔ | ✔ | |
| PlayReady Client 3.0 (見附注 3) |
✔ | ✔ | ✔ | |
| PlayReady Client 2.5 (見附注 2) |
✔ | ✔ | ||
| PlayReady Client 2.0 (見附注 2) |
✔ | ✔ | ||
| PlayReady Client 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 用戶端。 2011 年至 2017 年間發行的大部分非 Windows 裝置(例如智慧型手機電視)都是 PlayReady 2.X 用戶端。
- (1) 2008 年至 2011 年間發行的大部分非 Windows 裝置(例如智慧電視)都是 PlayReady 1.X 用戶端。
以下是 PlayReady Header 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 Header 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 Header 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 Header v4.3 的授權取得要求,將會擲回例外狀況。
- 授權回應可以包含一或多個授權,其中每個授權都包含一個密鑰和任意數目的原則。
為何遺漏 ALGID 值
Microsoft建議加密程式一律在 PlayReady 標頭中包含與處理內容時所包含的相同 ALGID 值。
在標準案例中,加密程式會加密內容,並在內容中產生 PlayReady 標頭。 加密程式知道用於加密的 AES 模式;因此,它會在 PlayReady Header 的 ALGID 屬性中包含這項資訊。 用戶端會根據從實際內容剖析的 PlayReady 標頭起始授權要求,因此 ALGID 值存在且有效。
在某些情況下,用戶端會根據簡單的 KID 值來起始授權要求(128 位 GUID)。 在此情況下,插入授權要求之 PlayReady 標頭中的 ALGID 值將會遺失(也稱為未指定)。 其中一個範例是用戶端使用 HTML5 EME API 提出授權要求時。
用戶端如何處理遺漏的 ALGID
如果客户端基於接收到的 PlayReady 標頭發起授權請求,則授權請求中的 ALGID 值會反映標頭中的值,因為授權取得挑戰包含了 PlayReady 標頭的一份副本。 在此案例中:
- 對於所有 PlayReady Headers v4.2 或更低版本,ALGID 值是必要的,而且必須有效。
- 對於 PlayReady Headers v4.3 或更高版本,ALGID 值可以存在且有效或遺失。
伺服器 SDK 如何處理 ALGID 缺失的情況
透過授權回應傳遞的所有授權都必須包含有效的 ALGID 值。
如果傳入授權要求中未指定 ALGID,授權伺服器必須從服務的後端取得這項資訊,並將正確的值放在授權回應中。
初始化向量 (IV)
在 PlayReady 3.3 版和更早版本中,CTR 模式僅支援 64 位 IV(8 位元組的 IV)。 從 PlayReady 4.0 版開始,CTR 和 CBC 模式都支援 64 位和 128 位 IV(8 位元組和 16 位元組的 IV)。
範例:
- 現在支援符合HLS標準的數據流,這些數據流經常在CBC模式中使用128位初始化向量(IV)。
- 現在已經支持符合 HbbTV 標準的流,這些流在 CTR 模式中使用 128 位 IV。
局限性
- PlayReady 標頭必須針對所有 KID 元素只使用一個 ALGID 值。 換句話說,用來加密資產不同軌道和品質的所有密鑰都必須是 AES CTR 或 AES CBC。 如果 ALGID 在任何 KID 元素上遺失,則必須從所有 KID 元素中遺漏它。
- 在 PlayReady 4.4 版之前,當傳入的用戶端憑證為 Windows 且 SL2000 擲回例外狀況時,會產生具有 CBC 密鑰的授權。 這是因為 Windows 用戶端僅支援 SL3000 單位上的 CBC。 不過,如果此用戶端是 PlayReady 4.0 版的最低版本,並宣告支援 CBC 模式,則有可能將具有 CBC 金鑰的授權傳遞給 SL2000 用戶端。
- 當傳入的用戶端憑證屬於使用 4.0 之前版本 Porting Kit 的裝置時,若生成具 CBC 金鑰的授權,將會拋出錯誤。
- 當收到的授權請求未顯示支援 AES CBC 時,使用 CBC 金鑰生成授權將會拋出例外錯誤。
這很重要
服務不得使用相同的 {KID, Ck} 加密 CTR 模式和 CBC 模式中的單一內容。
- 基於功能考慮,取得 {KID、Ck、AESCTR} 和 {KID、Ck、AESCBC} 授權的用戶端將無法運作。
- 基於健全性考慮,攻擊者在CBC和 CTR 模式中存取以相同密鑰加密的相同內容,在未經授權的情況下,可以更輕鬆地解密內容。