嚴競雄
(1.南通理工學院計算機與信息工程學院,江蘇南通 226002;2.南通市虛擬現實與云計算重點實驗室,江蘇南通 226002;3.南通理工學院物聯網工程教研室,江蘇南通 226002;4.南通理工學院計算機技術應用研究所,江蘇南通 226002)
移動互聯網時代,視頻直播隨處可見,人們更愿意以手機直播的方式來進行溝通和交流,直播手段也由開始的網頁直播方式發展到移動手機直播方式[1],在享受移動設備便利的同時,網絡安全也成為日益重要的話題。如何在保證直播正常開展的情況下,維護用戶的個人信息和隱私不被泄露成為網民日益關心的話題。因此,直播信息安全越來越受到社會各界的重視。本文通過一種基于RTMP 協議鑒權接入方法的設計來進行流媒體系統的實現,從技術角分析了RTMP協議的安全性,對現有的流媒體架構進行改進,從而更好地保護直播數據流的信息安全。
由于竊取鏈接的頻繁發生,反竊取鏈接技術應運而生,即通過一些技術手段和加密方法,防止非法用戶訪問,防止鏈盜從原始網站獲取數據和流量,通過相關指標跟蹤來源。一旦檢測到來源不是站點,它將被阻止或返回到指定頁面,以實現防盜鏈。RTMP 協議是一種用于實時數據通信的網絡協議。它主要用于Flash/Air 平臺與支持RTMP 協議的流媒體/交互式服務器之間的音頻、視頻和數據通信,因此可以用于支持網絡直播。然而,當前的防盜鏈是基于HTTP 協議的網頁,這在RTMP網絡廣播中很難實現。
RTMP防盜鏈是指通過在RTMP協議通信中添加鑒權令牌,來保證視頻資源安全的一種方式。在加入RTMP 流媒體直播點播鑒權功能后,RTMP 協議中將包含若干個鑒權字符串,如用戶名、密碼、播放權限等。只有合法生成的鑒權令牌才能進行正常的推流和拉流;另外,推拉流的時間戳令牌具有時效性,只有在有效期內才能正常地推拉流。
流媒體客戶端采用ActionScript 編程語言進行設計與實現,通過Flash 采集用戶視頻和音頻,采用H264進行視頻編碼,通過RTMP協議將編碼的視頻流推送到RTMP 服務端,服務器采用C++語言開發的RTMPServer,對外提供RTMP 直播服務,包含了基于RTMP 流媒體協議的相關交互過程,具有較強的先進性及應用價值。
流媒體鑒權分為推流鑒權和拉流鑒權[2],都是利用RTMP 協議來實現的,該功能是通過RTMP 流媒體主機與客戶端推拉流程序配合實現:
1)啟用流媒體鑒權功能后,客戶端向視頻服務器請求推拉流地址前先將所需的權限信息和時效信息進行加密,生成鑒權串。
2)客戶端向視頻服務器發出包含鑒權串的RTMP請求。
3) 流媒體服務器對客戶端發送的RTMP 協議中的權限信息和時效信息進行提取,獲得加密鑒權串。
4) 流媒體服務器對RTMP 協議中的權限信息和時效信息進行驗證,對合法且在有效期內的請求正常響應,對非法或過期的請求拒絕響應。
在流媒體交互過程中,因為原始的RTMP 協議在客戶端與服務器交互連接時并沒有做權限驗證,因此對于未經授權的直播流,RTMP 流媒體服務器并沒有辦法進行屏蔽攔截,因此需要對協議進行優化改進。RTMP協議交互連接的原理如圖1所示。

圖1 RTMP協議交互過程

圖2 connect指令結構示意圖
在RTMP協議進行connect命令交互的時候,可以對connect 命令中的AMF 消息進行追加token 相關字段,用于用戶的權限驗證。
鑒權令牌的構成,即客戶端通過生成的鑒權串如下:推拉流地址中,ntoken、ptoken、ttoken、ftoken 字段分別代表用戶名、密碼、時間戳和播放權限,其中,ttoken是生成校驗字符串時的UNIX 時間戳,ntoken、ptoken、ttoken、ftoken中對應的值是根據一定規則生成的加密字符串。
項目架構如圖3 所示,發布端用戶通過RTMP 推流軟件將攝像頭采集的數據經過H264 編碼后,轉化為直播流推送到RTMP 流媒體核心服務器上,由核心服務器轉發給邊緣流媒體服務器,接收端用戶通過播放器連接邊緣流媒體服務器,從邊緣流媒體服務器上獲取數據流下載到本地進行視頻解碼,將解碼后的數據通過播放器播放出來[3]。這種架構設計的優點在于,當訪問或者是觀看人數眾多時,可以實現RTMP視頻流量的負載均衡,將流量分別分散到各個流媒體服務器上,減輕核心流媒體服務器的負載壓力,以獲得較好的觀看體驗。

圖3 流媒體架構示意圖
在RTMP服務器設計方面,可以按功能進行劃分,主要分為流媒體服務器的點播功能、直播功能、日志記錄功能等[4],在服務器端,通過對RTMP協議connect交互時的代碼進行改進,添加對connect時AMF信息的判斷比對,實現RTMP直播推流時的交互鑒權。

表1 鑒權字段示例
鑒權方法:RTMP服務器節點收到推流請求時做如下校驗。推流鑒權串中ttoken中的時間戳與當前時間相差不超過5分鐘;
校驗字段ntoken、ptoken、ftoken 所對應的值是否合法。RTMP服務器節點收到拉流請求時做如下校驗。拉流鑒權串中ttoken中的時間戳與當前時間相差不超過5分鐘;
校驗字段ntoken、ptoken、ftoken 所對應的值是否合法。
客戶端使用ActionScript 對Flash 進行編碼,設計與服務器在連接交互時的接口,需要對ntoken、ptoken、ttoken、ftoken 設計字段,首先構造Object 這樣一個類型的對象,將ntoken、ptoken、ttoken、ftoken這幾個屬性加入Object 對象當中,然后對ntoken、ptoken、ttoken、ftoken 進行賦值,分別表示姓名、密碼、時間戳和播放權限。之后新建一個NetConnection的對象nc,使用addEventListener 監聽網絡連接事件,最后在連接時將accessToken 放在nc 對 象connect 函 數 的最后。
鑒權字符串生成
var ntoken: String =Base64.encode("Jack");
var ptoken: String =Base64.encode("123456");
var ttoken: String =Base64.encode(ts);
var ftoken: String =Base64.encode("bofang");
var accessToken =new Object();
accessToken.ntoken =ntoken;
accessToken.ptoken =ptoken;
accessToken.ttoken =ttoken;
accessToken.ftoken =ftoken;
nc = new NetConnection();
nc.client=this;
nc.addEventListener(NetStatusEvent.NET_STATUS,netStatusHandler);
nc.connect("rtmp://192.168.10.254/live/",accessToken);
通過測試客戶端連接RTMP 流媒體服務器進行測試,可以從結果中看出,當客戶端發出的ntoken、ptoken、ttoken、ftoken 字段編碼經服務器校驗錯誤時,客戶端的播放請求遭到了服務器的攔截,客戶端的event.info.code 顯示為Failed。圖4 為鑒權失敗示意圖。

圖4 鑒權失敗示意圖
而當客戶端發出的ntoken、ptoken、ttoken、ftoken編碼字段經服務器校驗正確時,客戶端的播放請求得到服務器驗證后放行,event.info.code 顯示為Success。圖5為鑒權成功示意圖。

圖5 鑒權成功示意圖
通過這種方式進行流媒體鑒權,可以根據自身需求添加多個自定義加密Key,也可以用自定義的Key對默認的Key進行替換,同時還可以縮短或延長防盜鏈的有效時間。這樣的設計為用戶提供了自定義鑒權串的功能擴展和伸縮能力。
該方法與現有的RTMP 視頻服務相比較,優點在于客戶端向RTMP 服務器發起請求時,即客戶端和服務器雙方在進行connect交互時,客戶端在RTMP協議中對connect的AMF消息進行追加token字段,用于用戶的權限驗證。該方法主要運用了C++語言進行程序編寫,相關內容涉及Linux操作系統的配置與管理、流媒體服務器的安裝與配置以及RTMP 客戶端、發布端的部署與調優[5]。通過對RTMP協議connect交互時的安全性進行改進,以實現RTMP 直播推流時的交互鑒權,可以解決流媒體直播和點播過程中內容訪問鑒權和對流媒體內容進行保護等相關安全性問題,利用該成果可開發出基于RTMP 協議的流媒體交互安全認證平臺。