媒體轉碼HLS標準加密詳解

何昔發表於2017-11-30

1. 基本概念

祕鑰管理服務(Key Management Service,簡稱KMS)
一項安全管理服務,主要負責資料祕鑰的生產、加密、解密等工作。開通請點選這裡

資料祕鑰(Data Key,簡稱DK)也稱明文金鑰
DK為加密資料使用的明文資料金鑰

信封資料金鑰(Enveloped Data Key,簡稱EDK)也稱密文金鑰
EDK為通過信封加密技術保密後的密文資料金鑰

2. 原理

HLS標準加密是通過MTS呼叫KMS服務生成明文祕鑰DK進行加密,將對應的密文祕鑰EDK 通過keyuri傳送給客戶,keyuri 是客戶建立HLS標準加密工作流的時候需要傳入的一個引數,是使用者業務伺服器的URL地址;使用者業務伺服器keyuri可以通過 KMS的API介面解密接收到的密文祕鑰EDK得到明文祕鑰DK,再進行base64decode返回給客戶端,客戶端通過該值解密播放視訊;

3. 操作

1)開通KMS

2)呼叫sdk 建立工作流,傳入對應的引數(點選檢視demo

工作流中關鍵配置

開始活動結點:InputFile:{“Bucket”:”bucketdemo”, “Location “:”oss-cn-hangzhou”, “ObjectPrefix”:”HLS-Encryption”};
此配置表示:內容創作者上傳視訊到杭州 oss://bucketdemo/HLS-Encryption 這個路徑下會自動觸發加密轉碼;

轉碼活動結點:Encryption:{“Type”:”hls-aes-128″, “KeyUri”:”https://decrypt.demo.com”};
轉碼完成後,KeyUri的配置會出現在m3u8檔案中,供播放器使用,內容類似:URI=”https://decrypt.demo.com?Ciphertext=aabbccddeeff&MediaId=fbbf98691ea44b7c82dd75c5bc8b9271″
其中Ciphertext引數的內容就是密文祕鑰EDK,MediaID就是該媒體資源的媒體ID;其中使用者業務伺服器KeyUri可以通過 KMS的API介面解密接收到的密文祕鑰EDK,得到明文祕鑰DK,再進行base64decode返回給客戶端,客戶端通過該值解密播放視訊;

3)上傳視訊

兩種方法上傳視訊,都會自動觸發加密轉碼
I 通過MTS控制檯上傳視訊至剛剛建立的工作流
II 通過OSS上傳工具上傳視訊至oss://bucketdemo/HLS-Encryption路徑
III 轉碼完成後,m3u8檔案內容示例

 #EXTM3U
 #EXT-X-VERSION:3
 #EXT-X-TARGETDURATION:5
 #EXT-X-MEDIA-SEQUENCE:0
 #EXT-X-KEY:METHOD=AES-128,URI="https://decrypt.demo.com?Ciphertext=aabbccddeeff&MediaId=fbbf98691ea44b7c82dd75c5bc8b9271"
 #EXTINF:4.127544,
 15029611683170-00001.ts
 #EXT-X-ENDLIST    

4) 播放

播放器播放加密轉碼後的m3u8資源:https://vod.demo.com/test.m3u8
播放器解析得到EXT-X-KEY:METHOD=AES-128,URI=https://decrypt.demo.com?Ciphertext=aabbccddeeff&MediaId=fbbf98691ea44b7c82dd75c5bc8b9271 的URI部分內容,向URI請求獲取明文祕鑰DK 的base64decode資料;業務端接收到請求,根據Ciphertext=aabbccddeeff解析得到密文祕鑰EDK: aabbccddeeff,業務端呼叫KMS API介面解析密文祕鑰EDK,得到明文祕鑰DK,進行base64decode返回給播放器端;播放器端根據得到的明文祕鑰DK 的base64decode資料解密播放m3u8視訊;

播放器支援:safari瀏覽器,蘋果系的 H5播放都支援,VLC支援,MTS WEB播放器不支援

4. 業務安全

如果使用者想要業務安全,那麼可以考慮客戶端訪問加密視訊m3u8的時候加引數MtsHlsUriToken;
比如正常的播放地址為https://vod.demo.com/test.m3u8, 當拼接攜帶MtsHlsUriToken引數後為https://vod.demo.com/test.m3u8?MtsHlsUriToken=業務方頒發的令牌

播放時,播放器向阿里CDN請求https://vod.demo.com/test.m3u8?MtsHlsUriToken=業務方頒發的令牌 ,阿里CDN會動態修改m3u8檔案中的解密URI(EXT-X-KEY:METHOD=AES-128,URI=”https://decrypt.demo.com?Ciphertext=aabbccddeeff&MediaId=fbbf98691ea44b7c82dd75c5bc8b9271″),如原為https://decrypt.demo.com?Ciphertext=aabbccddeeff&MediaId=fbbf98691ea44b7c82dd75c5bc8b9271 , 修改後為 https://decrypt.demo.com?Ciphertext=aabbccddeeff&MediaId=fbbf98691ea44b7c82dd75c5bc8b9271&MtsHlsUriToken=業務方頒發的令牌

所以,播放器最終請求解密URI為:https://decrypt.demo.com?Ciphertext=aabbccddeeff&MediaId=fbbf98691ea44b7c82dd75c5bc8b9271&MtsHlsUriToken=業務方頒發的令牌 ,此地址中,攜帶了業務方搬發的令牌,業務方進行驗證即可

5. 業務方需要做的事情

1】搭建頒發及驗證MtsHlsUriToken令牌服務
2】校驗解密令牌,推薦一個令牌只允許使用一次
3】解密金鑰:EDK即Ciphertext, 此時,要呼叫KMS服務的解密介面進行解密 介面說明, 解密後,可快取,以減少不必要的網路IO
4】解密拿到DK即明文金鑰,需要base64decode, 然後返回給播放器


相關文章