當前位置:
首頁 > 最新 > 基於HLS流媒體協議的視頻加密方案

基於HLS流媒體協議的視頻加密方案

本文只討論應用於瀏覽器環境的流媒體協議的加密。

背景

付費觀看視頻的模式是很多平台的核心業務,如果視頻被錄製並非法傳播,付費業務將受到嚴重威脅。因此對視頻服務進行加密的技術變得尤為重要。

本文所指的視頻加密是為了讓要保護的視頻不能輕易被下載,即使下載到了也是加密後的內容,其它人解開加密後的內容需要付出非常大的代價。

無法做到嚴格的讓要保護的視頻不被錄製,原因在於你需要在客戶端播放出視頻的原內容,解密的流程在客戶端的話不法分子就能模擬整個流程,最保守也能用屏幕錄製軟體錄製到視頻的原內容(可以通過加水印的方法緩解下)。我們的目標是讓他獲取原內容的代價更大。

簡介

????????起初是為了將業務中已有的基於 Flash 的視頻播放器替換為不依賴 Flash 的HTML5 視頻播放器,主要使用了現有的 video.js 開源播放器做的定製化開發。當完成視頻播放器的製作後,在進一步延伸 WEB 端視頻加密的相關內容時,開始了解並逐漸深入的研究了相關視頻加密內容。

最終通過整理歸納,以及自身的理解,做了這個簡單的 Demo。目的是為了能夠給在視頻加密這方面有相同目的的童鞋提供微薄的幫助,要是能起到拋磚引玉的效果,自然是再好不過了。????????

項目啟動

1.安裝項目環境

安裝 node、npm 環境

根據 app 目錄下的 package.json 安裝對應的 npm 包

安裝 ffmpeg

2.啟動項目

在 app 目錄下,輸入npm start,啟動項目

在瀏覽器中訪問http://localhost:3000

按照頁面中的順序進行相關操作

3.許可權登錄

用戶名:admin

密碼:admin

項目原理

本項目的核心原理其實就是講解了一個視頻源從正常的 mp4 格式如何變為加密後的m3u8 文件 + ts文件 + key秘鑰文件,之後又如何在服務端被限制訪問,最終能夠在客戶端正常播放的視頻加密、解密並播放的流程。

項目原理圖示

技術棧

nodejs + express 實現伺服器開發

ffmpeg + fluent-ffmpeg 實現 node 環境下的視頻轉碼、加密

socket.io 通過 websocket 相關的類庫,實現實時輸出 ffmpeg 進行的視頻轉碼、加密操作

video.js + videojs-contrib-hls.js 實現客戶端的視頻解密及播放

html + css + js 實現簡單的前端開發

源碼簡析

項目目錄說明

源碼簡析

簡單的許可權判斷,app.js中:

express 的中間件

判斷請求的後綴

判斷 session 中是否有用戶名,有則允許訪問 .key 文件;否則禁止訪問

主要是保護 .key 文件,可以加入其它的許可權手段,比如 token、session 有效時長等等

利用 FFmpeg 對視頻進行加密、切片處理,在 encrypt.js 中:

利用了 FFmpeg 的切片和加密方法

建議可以深入研究 FFmpeg 框架的相關 api

可以根據實際業務來對視頻進行更符合要求的切片處理

視頻播放相關邏輯,player.ejs 中:

使用了 videojs 作為播放器插件

使用了 videojs-contrib-hls 作為切片流解碼插件

具體的邏輯代碼在 player.js 中

建議

本項目更多的價值在於展示出一整套的加密原理,同時為了證明這套原理的可行性,做的比較簡單的示例。

本項目不會提供相關技術棧的使用教程。

如果需要在實際應用中使用相關原理或技術棧,建議根據實際項目對部分或整體解決方案進行完善和擴展。

雜談

以下的內容均為個人觀點,僅供參考

由於本人自身是做前端開發的,所以很多相關的示例都是基於前端考慮,對於後端的相應的策略並不是很專業。比如後端伺服器,也採用的是偏前端的。我想表達的是,在整套解決方案中,我主要做了3件事:

第一,把 mp4 的視頻源通過 FFmpeg轉換為加密後的 m3u8 文件和 ts 文件以及關鍵的加密密鑰 key 文件;

第二,通過最簡單的許可權訪問,保護加密密鑰 key 文件;

第三,利用 video.js 及相關的 videojs-contrib-hls.js 實現客戶端的視頻文件解密,並播放。

因此可以看出關於視頻加密的解決方案中,最重要的其實是如何保護加密密鑰 key 文件,而這部分工作更多的是在於伺服器端的相關策略,比如可以使用 cookie、session 相關技術、添加自定義token校驗、有效時長機制等等方法保證秘鑰 key 文件的相對安全性、可靠性。

而如何將視頻源文件轉化為對應的加密後的文件,可以更多的研究開源庫 FFmpeg 的使用,甚至如果沒有迫切需求,可以考慮使用第三方視頻雲服務商的相關解決方案。至於客戶端的視頻解密,也可以研究 video.js 相關的內容。

完整項目

https://github.com/hauk0101/video-hls-encrypt

參考資料

流媒體加密 :https://github.com/gwuhaolin/blog/issues/10

Video.js: The Player Framework:https://videojs.com

FFmpeg:https://www.ffmpeg.org/

本文作者:WEB研發部-姚喬

---------- END ----------

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 唯醫技術團隊 的精彩文章:

TAG:唯醫技術團隊 |