天天看點

在短視訊開發中,移動端音視訊加密、防盜播實作方案

為了增加平台及使用者的盈利方式,有些短視訊源碼在開發設定了短視訊檢視的付費功能,要想保證該功能的正常使用,就需要對移動端的音視訊進行加密、防盜播處理,今天我們就一起來看看在短視訊開發中,移動端音視訊加密、防盜播實作方案吧。

注意:保證使用者體驗是前提。否則再好短視訊源碼,使用者體驗垃圾,也無法發展。

如今市面上,移動端加密、防盜播的方式很多。這裡隻是讨論一種:​<code>​我認為的使用者體驗較好,技術實作成熟,又有效防盜播的方式​</code>​。

注意:防止盜播,并不能100%杜絕盜播。隻能不斷增加短視訊源碼的破解成本,完全無法破解的短視訊源碼是不存在的。是以,想100%防止盜播也是不可能實作的。

這裡采用的方案是:​<code>​用戶端播放AES-128加密的m3u8媒體資源​</code>​

為什麼是m3u8 ?

m3u8采用AES-128對稱加密算法加密,技術成熟穩定

前邊說了,保證短視訊源碼使用者體驗為前提

短視訊源碼音視訊播放過程中,使用者進入播放頁後,音視訊的​<code>​秒開率​</code>​(1秒内成功加載的播放數/播放總數)是影響使用者體驗的重要名額;m3u8媒體資源是一個文本檔案,其由一個個ts視訊片段的播放位址構成,選擇合适的ts切片大小,能有效提高音視訊的秒開率,保證使用者的觀看體驗。

使用者體驗的大前提滿足了,那如何實作呢?

用戶端播放的視訊源為 ​<code>​AES-128對稱加密的 m3u8​</code>​ 媒體資源;

播放位址最終組織形式如下:

播放位址 ​<code>​https://domain/course101.m3u8​</code>​ 與​<code>​playKey​</code>​ 需從服務端擷取;

​<code>​加密m3u8的解密關鍵就在于playKey​</code>​,是以,​<code>​防止playKey被破解是防盜播的一個關鍵點​</code>​

将最終播放位址交于播放器播放

對于m3u8媒體資源,無論是 ​<code>​視訊切片加密​</code>​、​<code>​ts視訊片段解密播放​</code>​ 在技術實作上已經非常成熟,不存在技術壁壘,實作已經不是問題。

那麼擺在移動端最主要的問題就是:防止短視訊源碼媒體資源被盜播,維護内容生産者的利益

注:雖然技術實作已經不是問題,但這裡還是會把 ​<code>​移動端技術實作的細節​</code>​和 ​<code>​防破解(防盜播)​</code>​的實作細節進行呈現。

技術實作上,大概分為以下幾個步驟:

擷取短視訊源碼媒體資源播放位址

擷取媒體資源的解密token (playKey)

拼接最終播放位址,播放m3u8媒體資源

下面我們從短視訊源碼移動端請求音視訊内容清單,到成功播放的全過程來舉一個例子:

首先通過音視訊ID 101向服務端發起請求,擷取該音視訊的内容清單。請求方式和傳回結果如下:

為了簡單易懂,這裡簡單模拟一個get請求:

請求參數 ​<code>​courseId​</code>​ 為 ​<code>​101​</code>​;

請求位址為 ​<code>​https://domain/xxx/getCourseList.do​</code>​;

擷取id為101的音視訊,其對應的内容清單。

音視訊101的音視訊内容清單如下:

正如注釋中寫的:

​<code>​mediaId​</code>​ 是​<code>​媒體資源id​</code>​ ;

​<code>​mediaUrl​</code>​是​<code>​媒體資源的m3u8播放位址​</code>​;

可能會疑問: n3GuNo5Rc44anmLGrRU8Rne/JU9cHzc1vXZWiYEwcD0= 是什麼鬼,為什麼不像播放位址?

這裡正是​<code>​防止媒體資源被盜播,維護内容生産者的利益的 第二步​</code>​

這裡将資源位址​<code>​https://domain/course101.m3u8​</code>​進行了一個簡單的AES加密

對于其資源位址的加解密,會在下文進行詳細說明。

​<code>​encryptId​</code>​ 則是 ​<code>​用于擷取媒體資源的解密playKey​</code>​。

encryptId的具體作用,會在下文中詳細說明

注:這裡伺服器要做一個使用者權限的校驗:未購買使用者不傳回其 mediaUrl 和 encryptId

未購買使用者不傳回其 mediaUrl 和 encryptId

正是預防短視訊源碼移動端被不良用心的人員,惡意采用Http抓包進行破解。​<code>​是防止媒體資源被盜播,維護内容生産者的利益的 第一步​</code>​,也是很重要的一步。 因為:

短視訊源碼移動端無論如何防破解,總不能100%保證無法破解;

想要擷取播放位址,必須購買音視訊内容,對于用心不了的人員,增加了其破解成本;

未購買使用者,通過音視訊ID 101向服務端發起請求,傳回資料如下:

注:未購買使用者,請求某音視訊清單接口時,不要傳回 ​<code>​媒體資源的m3u8播放位址​</code>​ 和 ​<code>​擷取媒體資源playKey的encryptId​</code>​。這很重要

為防止移動端短視訊源碼被Http抓包,​<code>​mediaUrl​</code>​ 與 ​<code>​encryptId​</code>​ 都不是明文傳輸的。是以移動端拿到課程的内容清單後,首先需要對​<code>​mediaUrl​</code>​ 與 ​<code>​encryptId​</code>​進行解密。

關于解密:

對稱加密算法,大家可以根據實際需求,自行進行選擇;

解密相關代碼,​<code>​建議由C語言實作,打成SO添加到移動用戶端中​</code>​;

原因是​<code>​增加短視訊源碼移動端破解難道,提高破解成本​</code>​。

這裡隻是采用了簡單的AES對稱加密:

完成解密後的資料格式如下:

在第1步中,已成功擷取到媒體資源的播放位址 ​<code>​https://domain/course101.m3u8​</code>​與​<code>​encryptId​</code>​。為了播放短視訊源碼媒體資源,下面來擷取到加密m3u8視訊的解密​<code>​playKey​</code>​

這裡 ​<code>​playKey​</code>​ 仍然需要從服務端進行擷取,擷取方式如下:

發起請求:

傳回結果:

這裡仍然模拟一個簡單get請求:

請求參數 ​<code>​encryptId​</code>​ 為 ​<code>​qazwsx101​</code>​;

請求參數 ​<code>​mediaId​</code>​ 為 ​<code>​101​</code>​;

請求位址為 ​<code>​https://domain/xxx/getMediaToken.do​</code>​;

注:playKey是加密m3u8解密的關鍵,是防止短視訊源碼媒體資源被破解的重中之重。

這裡是​<code>​防止媒體資源被盜播,維護内容生産者的利益的 第三步和第四步​</code>​

1、​<code>​playKey​</code>​ 服務端需​<code>​加密傳輸​</code>​;

2、請求​<code>​getMediaToken.do​</code>​接口時,短視訊源碼服務端需對該使用者的購買狀态進行驗證,未購使用者不傳回其對應的playKey;

3、移動端擷取到playKey後,在SO(C層代碼達成的)中對playKey進行解密;

4、解密後的playKey存在一定的過期時間;或者使用次數限制(建議服務端限定隻能使用一次)

加密算法要與mediaUrl 和encryptId 的解密算法區分開,增加破解成本

經過以上步驟,購買使用者成功擷取到 ​<code>​播放位址 https://domain/xxx/getMediaToken.do​</code>​和​<code>​解密key I_am_playkey_001​</code>​。

将mediaUrl 與playKey 拼接起來,可以交給播放器播放了:

到此,移動端的工作完成。

OK. ​<code>​移動端完事大吉​</code>​。

到這裡短視訊源碼播放器與服務端的互動剛剛開始。

這裡有必要先介紹一下,加密m3u8視訊的檔案格式:

加密m3u8視訊的檔案格式

以上為加密m3u8視訊的檔案格式:

短視訊源碼播放器在播放前,會用該位址 ​<code>​http://domain//hls.key​</code>​向業務​<code>​伺服器​</code>​發起請求,請求加密m3u8視訊的​<code>​解密秘鑰​</code>​;

解密秘鑰如下圖所示:

加密m3u8視訊的​<code>​解密秘鑰​</code>​并非​<code>​playKey=i_am_decrypting_key101​</code>​,而是一個16位元組的檔案。

m3u8的解密秘鑰實際是一個16位元組的檔案。

這裡肯定會有很多疑問,别着急,我們繼續前邊的話題​<code>​播放器​</code>​與​<code>​服務端​</code>​互動。

播放器 與 服務端 互動

當 ​<code>​播放器​</code>​ 向 ​<code>​服務端​</code>​ 發起​<code>​https://domain/course101.m3u8?playKey=i_am_decrypting_key101​</code>​ 請求後;

​<code>​服務端​</code>​ 處理相對複雜

a、首先校驗​<code>​playKey=i_am_decrypting_key101​</code>​是否有效;

b、若有效則将加密m3u8視訊中的​<code>​http://domain//hls.key​</code>​更換為​<code>​http://domain//hls.key?playKey=i_am_decrypting_key101​</code>​;

c、下發m3u8檔案給播放器;

​<code>​播放器​</code>​收到​<code>​服務端​</code>​下發的​<code>​加密m3u8​</code>​檔案後:

a、​<code>​播放器​</code>​讀取​<code>​加密m3u8​</code>​檔案,擷取​<code>​解密秘鑰​</code>​的請求位址​<code>​http://domain//hls.key?playKey=i_am_decrypting_key101​</code>​;

b、​<code>​播放器​</code>​向​<code>​服務端​</code>​發起 ​<code>​http://domain//hls.key?playKey=i_am_decrypting_key101​</code>​請求,請求解密秘鑰;

​<code>​服務端​</code>​收到​<code>​播放器​</code>​的請求後,需對​<code>​playKey=i_am_decrypting_key101​</code>​進行校驗,檢視是否過期或者被使用過,若存在異常則不下發秘鑰;若正常,則下發秘鑰

​<code>​播放器​</code>​收到秘鑰檔案後,正常播放;

OK. 這次是真的 ​<code>​完事大吉​</code>​。

如果僅僅做到上一步就結束了,短視訊源碼移動端被破解的機率還是很高。因為SO任然可以被反編譯破解,而且SO的反編譯技術也已經相當成熟。

是以,​<code>​無論在SO中采用了怎樣複雜的加密算法,SO被反編譯後,還是有被破解的可能​</code>​。

是以,以上步驟都完成後,我們仍然要對我們最終生成的短視訊源碼進行一次加密。​<code>​Android端推薦采用短視訊源碼加強處理​</code>​。

以上步驟都做完,如果短視訊源碼仍然被破解了。我們可以再加一層防破解處理:​<code>​動态下發SO,定期更新加密算法​</code>​。

這樣就算線上短視訊源碼被破解了,也可以在不發版的情況下從容應對,更新一下加密算法就可以了。

這裡來簡單總結一下,上邊介紹的實作步驟 :

a、移動端拿 courseId 向服務端發起Http請求,​<code>​擷取課程的内容清單​</code>​;

b、服務端對使用者進行權限驗證,​<code>​未購買使用者不傳回其對應的播放位址​</code>​;

c、移動端​<code>​在SO層中對 mediaUrl與 encryptId 進行解密​</code>​;

d、移動端 用解密後的encryptId,​<code>​向服務端請求對應媒體資源的 playKey​</code>​

e、服務端對使用者進行權限驗證,​<code>​未購買使用者不傳回其對應的 playKey​</code>​;

f、移動端 ​<code>​在SO層中對 playKey 進行解密​</code>​;

注意,一定要與第三步的解密算法區分開

g、​<code>​拼接mediaUrl 與 playKey​</code>​ ,交給短視訊源碼播放器播放;

到此,移動端工作完成。

h、​<code>​播放器​</code>​向​<code>​服務端​</code>​發起下發m3u8請求

i、​<code>​服務端​</code>​校驗playKey;并動态替換m3u8中的URI字段

j、​<code>​播放器​</code>​從m3u8檔案中取出URI字段後,向短視訊源碼服務端請求解密秘鑰;

k、​<code>​服務端​</code>​校驗playKey;并傳回解密秘鑰檔案;

l、​<code>​播放器​</code>​播放

到此,加密m3u8 終于播放出來了。

m、移動端短視訊源碼加強處理;

n、為增強破解難度,這裡解密​<code>​SO可由動态下發,定期更新加密算法​</code>​;

m、如果仍然擔心短視訊源碼被破解,服務端下發的​<code>​解密秘鑰檔案​</code>​可以設定為非明文狀态;用戶端拿到解密秘鑰後,以本地代理的方式設定給播放器進行播放。

注:這裡有三個關鍵步驟:1、服務端對使用者進行權限驗證,未購買使用者不傳回其對應的播放位址;2、移動端 在SO層中對 playKey 進行解密;3、移動端App加強處理。

這三個關鍵步驟缺一不可,缺少任何一個移動端的破解難度和成本都将大大降低。

未購買使用者不傳回其對應的短視訊源碼播放位址

可以極大的降低付費音視訊内容被大面積破解的情況出現。因為購買音視訊内容亦需要成本。破解的音視訊内容越多,那需要購買的音視訊内容就越多,破解成本也就越高。

在SO層中對 playKey 進行解密

對于加密m3u8媒體資源,破解的關鍵就在于playKey,是以playKey的加密算法應足夠的複雜

移動端短視訊源碼加強處理

移動端短視訊源碼加強,是移動端代碼反編譯非常重要的一環。如果沒有這一環​<code>​在SO層中對 playKey 進行解密​</code>​的作用不是很大,因為無論SO中加密算法如何複雜,隻要SO被翻遍後,再複雜的加密算法也沒有意義了。

以上為全部處理流程

如果以上步驟都做了,付費音視訊被盜播的可能性應該不大;但仍然存在Http抓包的可能性:

http抓包時,會抓到​<code>​https://domain/course101.m3u8?playKey=i_am_decrypting_key101​</code>​請求

由于playKey隻有一次使用有效,或者幾個小時的逾時時間。是以該内容無法被大規模傳播;

http抓包時,會抓到短視訊源碼播放器的秘鑰下發請求 ​<code>​http://domain//hls.key?playKey=i_am_decrypting_key101​</code>​;

由于服務端存在playKey有效性的校驗,下次使用失效,是以也無法大規模傳播;

如果對服務端明文秘鑰檔案下發存在疑慮,可以做以上流程圖的“防盜播9”;

​<code>​防盜播9​</code>​ 加上​<code>​短視訊源碼加強​</code>​,在實作上應該是比較安全了

以上就是“在短視訊源碼開發中,移動端音視訊加密、防盜播實作方案"的全部内容,希望對大家在短視訊開發時能有幫助。

繼續閱讀