1. 程式人生 > >Android視訊加密那點事兒!

Android視訊加密那點事兒!

前言

最近有需求要做視訊的加密。因為視訊下載到本地後,為了防止二次拷貝和二次上傳到其他渠道,有些還是付費的視訊,因此要對視訊做加密,加密給了二週的研究時間,留下兩週作為開發和測試階段,故事就這樣開始了! 分片加密  萬事開頭難。    “邊播放邊解密”,這是加密解密的最優方案,因此第一週研究的就是這些,當時想到如果可以獲取到播放器的回撥幀應該可以實現,我們用的是vitamio播放器(維他蜜,官方沒有開源,甚至還收費,國內公司“一下科技”開發demo併發布到github,他們的公司爆款產品“秒拍”,“小咖秀”,“一直播”估計都是用的這個vitamio播放器) 首先感謝一下科技 大笑
,我們公司用的就是這個,我之前很想進一下科技呢,明星公司吧!
迴歸正題,vitamio並沒有提供資料幀的回撥函式,後來想想,即使提供了這個回撥,對於及時的加密和解密也是不行的,播放過程中解密使用者解密會有卡頓,這個方案就拋棄了,不過七牛的播放器有提供資料幀的回撥,七牛的產品我一直是信賴的,這個說是自主研發的,我也聽說還是基於ijkplayer二次開發的,不過不重要了,我們能用就行了,其github地址如下: 七牛播放器
android版的demo很豐富,勾選視訊幀回撥,可以從log中看到當前幀的byte大小. 不過這個方案先暫時摒棄了. 最後,針對分片加密,看到了蘋果公司的HLS(Http Live Stream)協議,他這個協議是蘋果的動態位元速率自適應技術,主要用於PC和Apple終端的音視訊服務。其包括一個m3u8的索引檔案,TS(Transport Stream)媒體分片檔案和key加密串檔案。
HLS的關鍵其實是生成m3u8索引檔案和TS媒體檔案.   這是一個完整的並且加密過的TS檔案和m3u8索引檔案,這個key是祕鑰,可以看到m3u8索引檔案裡的內容都是按照HLS規範來編寫的,ios系統天然支援m3u8,系統播放器都可以播放m3u8視訊,android3.0之後支援HLS協議,因此也可以播放m3u8視訊,目前android端vitamio,VLC等可以播放m3u8,因為你傳給播放器的是一個m3u8索引檔案,播放器會根據索引檔案裡的內容,播放相應的TS檔案,如果TS是加密過的檔案,則會先使用key解密ts檔案並播放,其實很好理解,可以看西安上面的兩個圖片進行理解,最好可以自己嘗試編寫下.
兩週的時間,研究得出,可以使用這個方式來進行視訊的加密和解密,這個方案還是最好的,但是需要伺服器的支援,伺服器需要切片出TS檔案並進行AES加密,然後客戶端下載到本地丟給播放器播放,因為這種方式是基於HLS協議,m3u8格式固定,播放器可以自行解密,那問題來了,如果這樣做,視訊給其他播放器不是還是可以播放嗎,解決方法是將m3u8索引檔案再次加密下,索引檔案也就幾十kb,加密後,客戶端解密後丟給播放器播放,這樣第三方的播放器就播放不了了,我其實很想將這個方案運用到專案中,但是伺服器壓力比較大,本次的需求只是將視訊下載到本地,然後加密,解密播放即可,最後就暫時放棄了這個方案,也許後續的版本會使用這個方案,敬請期待吧!

異或加密

異或加密其實不算是加密,因為它是對檔案進行前後的反轉,因為我們知道播放器從開頭開始播放的,我們把開頭的幾十或者幾百位元組進行異或加密,則播放器就播放不了了,而兩次異或加密就是解密,這種方法比較簡單,適合比較簡單的加密,而且容易破解,因此不建議使用,當然大家可以適當的瞭解下. 這種方式的加密對於大檔案來說也是不耗時的,非常快,我們可以使用RandomAccessFile這個類來隨機讀取檔案的內容進行異或,播放器是從頭開始播放的,我們就從頭開始,異或幾十個位元組即可完成加密,解密操作就是再進行一次異或即可.

前,中,後,對檔案加密2M的長度

 最後確定使用的方案是對檔案進行前中後進行三段加密,加密總長度為2M的大小(即前面讀取512kb,中間讀取1M,檔案末尾讀取512kb). 這三段加密都涉及到檔案的讀取,尤其對於大檔案的讀取,我們使用java的RandomAccessFile(隨機訪問檔案) 這個類來進行檔案的加密和解密. RandomAccessFile有兩種模式 一種是“讀寫”模式(rw),另一種是“只讀”模式(r),它沒有“只寫”模式,ios使用的fopen有隻寫模式.
  RandomAccessFile sourceRaf = new RandomAccessFile(sourceFile, "r");
  RandomAccessFile tempRaf = new RandomAccessFile(tempFile, "rw");


我們使用這個類對檔案進行加密和解密的操作. 針對這塊基本是檔案的讀取,我就不做過多的描述,原始碼如下,CSDN沒有分了,過段時間免費開源,見諒! Demo截圖: 1.1G 檔案加密耗時:    1.1G檔案解密耗時:   原始碼地址:

遇到的問題

1.分片加密時,要在手機端先走通這個流程,即自己完成TS切片,加密TS,自己編寫m3u8索引檔案,然後手機端使用vitamio播放器進行播放,這個過程,ios自身系統播放器不支援本地播放m3u8的視訊檔案,android端使用vitamio傳入本地路徑可以播放m3u8視訊,ios換成vitamio後也可以進行播放;第二個是要播放加密的m3u8檔案,首先要對TS進行AES加密,生成key檔案,手動編寫m3u8檔案,然後傳入播放器測試,分片加密耗時兩週測試完成,說明這個方式是可行的,我也非常想使用這個方式,但是針對目前需求稍許簡單,伺服器使用TS切片等壓力較大,暫時摒棄. 2.異或加密非常的快,對於大檔案,但是基於他非常的簡單,容易破解,摒棄. 3.檔案的前中後加密,這種方式是比較不錯的,PC端用於對小檔案的加密操作比較多,在使用RandomAccessFile進行追加內容時,需要手動將指標移動到當前檔案長度的位置,即raf.seek(xxx),再進行raf.write()追加操作.