某個客戶原來業務使用了mp3做爲播放格式,隨着業務的發展,發現優質的內容常常被成批的下載,這樣對客戶來講是很是嚴重的損失,考慮到用戶的播放需求須要在web瀏覽器也可以正常播放,以及總體改形成本,最終選擇了HLS標準加密的方案來保護用戶的內容。web
接入加密播放之後,發現一個較嚴重的問題,客戶端的播放成功率降低很是多,通過多方排查發現,這是由於特殊字符引起的一個問題。在解密播放的時候咱們經過EXT-X-KEY中的URI沒法正常獲取到解密的KEY,後者是拿到的KEY不對。因此初步懷疑是業務服務器對密鑰管理有問題。spring
本篇文章是由阿里雲視頻雲高級技術專家王海華撰寫,來記錄本次問題的排查、解決方案與後續避免措施。api
經過跟客戶業務服務器聯調發現:播放器發起以下請求:瀏覽器
返回的是請求非法,根據業務方判斷是MtsHlsUriToken的值不對!安全
打印了業務服務端獲取到和url請求以前的各自的MtsHlsUriToken參數值發現:服務器
IDXBq4HcS6VGUIh4iyUk3R2QnlGMS2MnWukBTqGhC oZxdeieVrAHVUU iwHN1kN
並不是是以前下發的架構
IDXBq4HcS6VGUIh4iyUk3R2QnlGMS2MnWukBTqGhC+oZxdeieVrAHVUU+iwHN1kN
對比發現很是明顯,url裏面參數的特殊字符被轉義給弄丟失了。跟客戶溝通下來發現用戶的業務服務環境是:spring boot 2.0 ,web容器是Tomcat。經過查閱資料和Tomcat的源碼發現Tomcat默認會對URL的參數進行URLDecode致使了url裏面的特殊字符被轉義給丟失了,產生了一開始的問題。app
整個問題排查過程仍是比較簡單的,可是從咱們這個場景裏面涉及到的交互很是多,不少環節都須要客戶進行參與,咱們如何能保證後續不出現這一類問題呢?咱們能夠從整個全鏈路的流程上來梳理一下。先看看整個HLS安全播放的總體業務流程。google
爲了瞭解整件事情過程咱們先了解一下整個HLS標準加密業務架構,業務流程和一些技術細節。
先看一下咱們如何獲得一個加密的視頻的。時序圖以下:
名詞解釋
關鍵步驟說明:
要對視頻進行解密播放有如下幾個關鍵步驟:
時序圖以下:
關鍵步驟說明:
1.form的enctype屬性爲編碼方式,經常使用有兩種:application/x-www-form-urlencoded和multipart/form-data,默認爲application/x-www-form-urlencoded。
2.如何對Url中的非法字符進行編碼:
Url編碼一般也被稱爲百分號編碼(Url Encoding,also known as percent-encoding),是由於它的編碼方式很是簡單,使用%百分號加上兩位的字符——0123456789ABCDEF——表明一個字節的十六進制形式。Url編碼默認使用的字符集是US-ASCII。
例如a在US-ASCII碼中對應的字節是0x61,那麼Url編碼以後獲得的就是%61,咱們在地址欄上輸入http://g.cn/search?q=%61%62%63,實際上就等同於在google上搜索abc了。又如@符號在ASCII字符集中對應的字節爲0x40,通過Url編碼以後獲得的是%40。
對於非ASCII字符,須要使用ASCII字符集的超集進行編碼獲得相應的字節,而後對每一個字節執行百分號編碼。對於Unicode字 符,RFC文檔建議使用utf-8對其進行編碼獲得相應的字節,而後對每一個字節執行百分號編碼。如"中文"使用UTF-8字符集獲得的字節爲0xE4 0xB8 0xAD 0xE6 0x96 0x87,通過Url編碼以後獲得"%E4%B8%AD%E6%96%87"。
若是某個字節對應着ASCII字符集中的某個非保留字符,則此字節無需使用百分號表示。例如"Url編碼",使用UTF-8編碼獲得的字節是 0x55 0x72 0x6C 0xE7 0xBC 0x96 0xE7 0xA0 0x81,因爲前三個字節對應着ASCII中的非保留字符"Url",所以這三個字節能夠用非保留字符"Url"表示。最終的Url編碼能夠簡化成"Url%E7%BC%96%E7%A0%81" ,固然,若是你用"%55%72%6C%E7%BC%96%E7%A0%81"也是能夠的。
本文做者:樰籬
本文爲雲棲社區原創內容,未經容許不得轉載。